--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit c4674992e0f8c76fd964873d085bbaf9651010d7
Parents : f3ec20b
Author : Sudo-Ivan <ivan@quad4.io>
Signature : Signature validation error
Date : 2026-01-04T15:57:49-06:00
lots of fixes, changes, styling, fixing outbound calls, rnode-flasher.
Changes
34 files changed, 6537 insertions(+), 283 deletions(-)
Diff
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a891a813..81197da0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,11 @@ Season 1 Episode 1 - A MASSIVE REFACTOR
### New Features
+- **Banishment System (formerly Blocked):**
+ - Renamed all instances of "Blocked" to **"Banished"**, you can now banish people to the shadow realm.
+ - **Blackhole Integration:** Automatically blackholes identities at the RNS transport layer when they are banished in MeshChatX. This prevents their traffic from being relayed through your node and publishes the update to your interfaces (trusted interfaces will pull and enforce the banishment).
+ - Integrated RNS 1.1.0 Blackhole to display publishing status, sources, and current blackhole counts in the RNStatus page.
+- **RNPath Management Tool:** New UI tool to manage the Reticulum path table, monitor announce rates (with rate-limit detection), and perform manual path requests or purges directly from the app.
- **Maps:** You can now draw and doodle directly on the map to mark locations or plan routes.
- **Calls & Audio:**
- Added support for custom ringtones and a brand-new ringtone editor.
diff --git a/README.md b/README.md
index 2b9dce53..b5097382 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ For issues contact me over LXMF: `73
[](https://git.quad4.io/RNS-Things/MeshChatX/actions/workflows/build.yml)
[](https://git.quad4.io/RNS-Things/MeshChatX/actions/workflows/docker.yml)
-A [Reticulum MeshChat](https://github.com/liamcottle/reticulum-meshchat) fork from the future.
+A [Reticulum MeshChat](https://git.quad4.io/Reticulum/Reticulum) fork from the future.
<video src="https://strg.0rbitzer0.net/raw/62926a2a-0a9a-4f44-a5f6-000dd60deac1.mp4" controls="controls" style="max-width: 100%;"></video>
diff --git a/electron/backend-manifest.json b/electron/backend-manifest.json
new file mode 100644
index 00000000..0bad21f0
--- /dev/null
+++ b/electron/backend-manifest.json
@@ -0,0 +1,3482 @@
+{
+ "_metadata": {
+ "version": 1,
+ "date": "2026-01-04",
+ "time": "06:17:38"
+ },
+ "files": {
+ "ReticulumMeshChatX": "9430b1f140db84c8749b32370bd055c049aa94f798b423788cf41879459a1587",
+ "frozen_application_license.txt": "988537f8e7c42331ddf7c807a20298955b93ea09785e4ed38cd4dd4ccc032c1d",
+ "icon.ico": "f0ca1240f4bc0bc6dfdedb7bdd03b4e39a1b25840ad5166bb4dc67864fe5f247",
+ "lib/LXMF/Handlers.pyc": "74295db6b2bad7a2c5028c6f91e0d28aa19e28e3acffc78f327acaca47cae108",
+ "lib/LXMF/LXMF.pyc": "04d3a37e01f5684d14995912db7c62866e9c5ecf65f51074fbfef2149df60ce7",
+ "lib/LXMF/LXMPeer.pyc": "c1bf6485ef9c8ce0bf6a105e4bf9b713e0d8d59d6fd98dec7c70c8a369576491",
+ "lib/LXMF/LXMRouter.pyc": "809f9aa8e1b28dc93c9e5e71a117e1881bfc20b2409c79b9fa82342788046095",
+ "lib/LXMF/LXMessage.pyc": "e3c2ea41ef33030eeced38ecbd11b19e992dc0c01b8368801cce6d3b56bdd58c",
+ "lib/LXMF/LXStamper.pyc": "ec531b5a12eba3cdf0be123bb8a71170f970b9592312d0a9d5cfe963609ad5e7",
+ "lib/LXMF/__init__.pyc": "ab464606de135b378a6d6aba61feb2f0b7e25677dbd75906ddb57400bd13a489",
+ "lib/LXMF/_version.pyc": "d953a723070a5dcd01029966c5610d486d58d4365e50a23b3865ec10f19744b5",
+ "lib/LXST/Codecs/Codec.pyc": "acca231e1b3caef34685186aec01419af0f3b5d5991e2c85df64a740863cfb4a",
+ "lib/LXST/Codecs/Codec2.pyc": "470e5a0ce03b314b4b29b8b34cdd0b9bef34d7cfdbea940b51e8a3de88f2d961",
+ "lib/LXST/Codecs/Opus.pyc": "f721244c0e4c239b2288b4a002a294dc8426ba7f267899cf1a68941e29e2493d",
+ "lib/LXST/Codecs/Raw.pyc": "0bc3bf59bf3ccc567aef02b4810a2c64a8485f03f5f7050eff67ac0200c30d19",
+ "lib/LXST/Codecs/__init__.pyc": "dbff677ed536f9c2b6e3ccdbdaa92a02497edaf6ab64918f53b9e4dc578a97d1",
+ "lib/LXST/Codecs/libs/pydub/__init__.pyc": "7ef852f560d1c887ed34c530f3a3ba6a120d1e0ee2380456b137de113ff33e52",
+ "lib/LXST/Codecs/libs/pydub/audio_segment.pyc": "643298d5b0257bbd9719b2a71bf290814539fa30f4620bc085db83f8646a07a4",
+ "lib/LXST/Codecs/libs/pydub/effects.pyc": "c399c5c993ccda5bbd701bf9010b57115b5e6bd56bb4c9f679773a186a54b21c",
+ "lib/LXST/Codecs/libs/pydub/exceptions.pyc": "e53e726f1bb7ee3ff67dfbaba9a71b08e8f78d3527e6ad0ec36005cf0d57b75b",
+ "lib/LXST/Codecs/libs/pydub/logging_utils.pyc": "5d2382ce56dead79e6635b9dbbb62276693b992b29b34c57c2d3ec371b00d81f",
+ "lib/LXST/Codecs/libs/pydub/silence.pyc": "ab74ad7e6daaa2365f7bbec4479319e65ad284cacdbf7669fdd19c42021cf6ca",
+ "lib/LXST/Codecs/libs/pydub/utils.pyc": "a226d924d5fc9ff157a64e58f786b10770dabeb3a802d0be361b32858a70ad4e",
+ "lib/LXST/Codecs/libs/pyogg/__init__.pyc": "3cc903976ff13d8df196c7857bae51eb424e1bb02233781e7428e12e28055f63",
+ "lib/LXST/Codecs/libs/pyogg/audio_file.pyc": "905fa028f062763120d257813fd844f1b25fc7a30715174da51d37d1263073e8",
+ "lib/LXST/Codecs/libs/pyogg/flac.pyc": "347fa08b44d70110ac31573f72a47159a0ef2ef0404ace28f7e3a9cee8834014",
+ "lib/LXST/Codecs/libs/pyogg/flac_file.pyc": "20e503470751e22f7a86df7e11fc6a782041749eee031b9c5de427547dfa4286",
+ "lib/LXST/Codecs/libs/pyogg/flac_file_stream.pyc": "37919027e7ff5f72d80872eeaf2cfcb6de39ff381c869a54123775aa87f08b6f",
+ "lib/LXST/Codecs/libs/pyogg/library_loader.pyc": "8ebb468e674f9837c0154fa8c40b454628b73f136d76076b684c2fe976a0fabb",
+ "lib/LXST/Codecs/libs/pyogg/libs/macos/README": "dbfc7b3afe61a41fba59e07d236688ca6d9bcadd9cbcdbee4fc268c4a64a0e6e",
+ "lib/LXST/Codecs/libs/pyogg/libs/macos/libFLAC.8.dylib": "f76564da36ec091dffbdd20edfd652b38cac315c92ead7d7371dabf8314ded55",
+ "lib/LXST/Codecs/libs/pyogg/libs/macos/libogg.0.dylib": "398deb4ce797a9b3a08d56081f6ec999c4c88cbdd50a36cad87d2f37ede7172b",
+ "lib/LXST/Codecs/libs/pyogg/libs/macos/libopus.0.dylib": "ff375387d3c50d384c4949d69e2bf1c19263ebc2aa77698c71bf85ba3d955f76",
+ "lib/LXST/Codecs/libs/pyogg/libs/macos/libopusenc.0.dylib": "d5d57f67c3912d9554641b5b1a30b111d36723ed463b91e76e7c6f7882767c39",
+ "lib/LXST/Codecs/libs/pyogg/libs/macos/libopusfile.0.dylib": "4bf93d3cfae4ac9b9bde446b3017d2fbcae2c936320ad8113c69cffc579d3982",
+ "lib/LXST/Codecs/libs/pyogg/libs/macos/libvorbis.0.dylib": "b43457ff25ec5a1abf3547d24aeb3b90a96ac006d85ae3e6b723bfb1ca465ba1",
+ "lib/LXST/Codecs/libs/pyogg/libs/macos/libvorbisenc.2.dylib": "40c730031fe4d201747b89e1f4291e4386b46f925d47b67c05e01aeb49f98efd",
+ "lib/LXST/Codecs/libs/pyogg/libs/macos/libvorbisfile.3.dylib": "fe499650bbe016beb8d5ce7672e4f46378ffd0a74fd5dc23ccb1e9f8f1ff5f08",
+ "lib/LXST/Codecs/libs/pyogg/libs/win32/libFLAC.dll": "6bc2027a54012cdbcd9834c18f6a30eb2b53b9ebef8e56b264f9e3a8c40c37ad",
+ "lib/LXST/Codecs/libs/pyogg/libs/win32/libcrypto-1_1.dll": "1051faaadf5576c8106ff9843db069c23b5ec9cd66e74ebcb65b7c6e2cf318e8",
+ "lib/LXST/Codecs/libs/pyogg/libs/win32/libssl-1_1.dll": "ec06895227b5f4b5618ade134d087953e0f06a35e8a7d9ea4217a11c5c6b451e",
+ "lib/LXST/Codecs/libs/pyogg/libs/win32/libvorbis.dll": "17e42fd237723b3aa824e6ca7aefa7f2d8eb7fbb536ea37dc3ecfea79355d4e3",
+ "lib/LXST/Codecs/libs/pyogg/libs/win32/libvorbisfile.dll": "78392a93e6903148d6fc8a7d25005ff8e22e394683ae5be7989509058984805e",
+ "lib/LXST/Codecs/libs/pyogg/libs/win32/ogg.dll": "b72338bf51835d7472f63ef3c6279a923d2127d6286576c62cc9bce7370c5fc8",
+ "lib/LXST/Codecs/libs/pyogg/libs/win32/opus.dll": "b4d47ccd5d2cb86f6fd9fb99da7554adc8e7cffdb873d48f607d407eec2033ea",
+ "lib/LXST/Codecs/libs/pyogg/libs/win32/opusenc.dll": "7a0222524b78f114555f18a1dee0ada25c60787de85cf443b1538767c6efae83",
+ "lib/LXST/Codecs/libs/pyogg/libs/win32/opusfile.dll": "275ead5c110cba4e9f98c841e22eff69882c5be3c1fdac280893e89ee38b0f11",
+ "lib/LXST/Codecs/libs/pyogg/libs/win_amd64/libFLAC.dll": "f59af83f8c64cc37ee523990da16c4135c2774fd6294a8f21dafc510099566b8",
+ "lib/LXST/Codecs/libs/pyogg/libs/win_amd64/libcrypto-1_1-x64.dll": "df6ee9b3db7a5e8302f2fdc00354cb258691af73398020003946fbbc592a7699",
+ "lib/LXST/Codecs/libs/pyogg/libs/win_amd64/libssl-1_1-x64.dll": "f218c99fdc3da374af464d437022639ed77eadb349b377f5fde1bf51a4345965",
+ "lib/LXST/Codecs/libs/pyogg/libs/win_amd64/libvorbis.dll": "ff676051b50b5561cda1701f6b84bbdd6f8cc9f36aeecb05dc534e73b91ff539",
+ "lib/LXST/Codecs/libs/pyogg/libs/win_amd64/libvorbisfile.dll": "a86b65a11eccd35a3802844f5abd2ea1c15bf3d160fb49d3dd18c540e08bee11",
+ "lib/LXST/Codecs/libs/pyogg/libs/win_amd64/ogg.dll": "3bfe098e8c087ce2d89e648be88cfdf91bfcb440ac312eb3d89788bd07cbcde2",
+ "lib/LXST/Codecs/libs/pyogg/libs/win_amd64/opus.dll": "776e40e3f5c1dbdd37281ddbdafd4eb82660420f764d6c3d5b7d4229fcf788ff",
+ "lib/LXST/Codecs/libs/pyogg/libs/win_amd64/opusenc.dll": "f00ad84ec2c01eb586081baec0277c8cd1a01c6bfb5dcec57d99ede0c3aa9e4d",
+ "lib/LXST/Codecs/libs/pyogg/libs/win_amd64/opusfile.dll": "216aee2dfc17e9e47da999a63c8af46d63f4c559ad978ba642d25f140b47b99d",
+ "lib/LXST/Codecs/libs/pyogg/ogg.pyc": "8872933f7fe0160dcea07ec3070bcdcce27643e5287505c4f80ef143b40edb4a",
+ "lib/LXST/Codecs/libs/pyogg/ogg_opus_writer.pyc": "efecf8635bc77523624af8d088188bbf533f1d4d776e02e0bb85b109cf831515",
+ "lib/LXST/Codecs/libs/pyogg/opus.pyc": "74934353ae62d9a4e045d8bed20599eb8510673b050c1de98c04d90fda933d14",
+ "lib/LXST/Codecs/libs/pyogg/opus_buffered_encoder.pyc": "17a2d9120557bcc275daed5df76115e18eb4686a470dfa3b1b8ce17fa3a03477",
+ "lib/LXST/Codecs/libs/pyogg/opus_decoder.pyc": "e8019d15360166c3054769ec0472344dbe356e1daacab65ca977a4c4c8565f5d",
+ "lib/LXST/Codecs/libs/pyogg/opus_encoder.pyc": "f32319239e2c3c7fdec33ac5ad8c3669496f79253fb141267f7b610f5e57ec09",
+ "lib/LXST/Codecs/libs/pyogg/opus_file.pyc": "ab3cd5904d9c0130d61521986fe3fa87184ac29f76eb5e256dae364c1a67e0ce",
+ "lib/LXST/Codecs/libs/pyogg/opus_file_stream.pyc": "ba4ef4091fb7b716da21beb89e53f0ec6fef5149c5657eca80e4e823dffdd744",
+ "lib/LXST/Codecs/libs/pyogg/pyogg_error.pyc": "93d150539deeb9074e39975fcca50ac3062db34ac7e8e434979473639ac98bb5",
+ "lib/LXST/Codecs/libs/pyogg/vorbis.pyc": "1a2b79aae0d16def06800b9655c8c5fd3ebca1748159dee68035cd859c21370f",
+ "lib/LXST/Codecs/libs/pyogg/vorbis_file.pyc": "5b4623a89ffe784a14a21eead2eafa3d62300d661213534a110bb4981fb74fa4",
+ "lib/LXST/Codecs/libs/pyogg/vorbis_file_stream.pyc": "6da0416ecae27c4aaa846cd4ee36a758b859d8203b69cd0775e5ceb4c840d976",
+ "lib/LXST/Common.pyc": "94a9d30a846e8a38fcfa000939b772f7b76ebb368f1ad6b82c393da5731dd462",
+ "lib/LXST/Filters.def": "9aaa83245e5091d5ef0b6d6304e477cdd9d44a28ba9e640b12200c754101f417",
+ "lib/LXST/Filters.h": "fecdf1bfbb97abe8a22ad99e2a1bee6822ef86f4d0eb1cbd9b31f6867d1f06e3",
+ "lib/LXST/Filters.pyc": "ef094f22a9ed2ec3315f140ba82644cd249f5928176388f231d434ff8325db86",
+ "lib/LXST/Generators.pyc": "62ec97d015a651678ef0ee2bc82c1cdd2b25ab793476d4fd24ae532cab973174",
+ "lib/LXST/Mixer.pyc": "ded75fea056b239ea77b63a8e54e09c0192d8a2b69c2aad706fa8aeed3f303fb",
+ "lib/LXST/Network.pyc": "3e0ac48a381b5ecc5039b5bb5bdd38538859a6538f2fff6ea397952a11313db1",
+ "lib/LXST/Pipeline.pyc": "edd70d610d57006a5e2e76704092ef671b0b72731bc2c21848f3a0b8b1a1d41f",
+ "lib/LXST/Platforms/__init__.pyc": "cc8e0e4150b2cf7e2f35bd59ede2c4adb1e74339ba14cf5c4e8427b6ead1a5f7",
+ "lib/LXST/Platforms/android/__init__.pyc": "774c931cd70272ef8052f2a1c60d3007e7c1b4ea6fd72185c7aa60de8cdc5878",
+ "lib/LXST/Platforms/android/soundcard.pyc": "4433b62dd6b107e4cf8e087bce8f046a36cfe160a45242a6b796ee065d144091",
+ "lib/LXST/Platforms/darwin/__init__.pyc": "7141f3a9f09b929b57a478bbd8cf2dcddbffdb8330689b9c1da6ecc6a516cfb7",
+ "lib/LXST/Platforms/darwin/coreaudio.h": "3f2682819c61bd1f80cd528f958b49b7ca842c69f766eb86467886d71adac3df",
+ "lib/LXST/Platforms/darwin/coreaudioconstants.pyc": "44fd15c416a0aff45bb936d48cb0779fb1742b57684e1ed989300e1d00d72505",
+ "lib/LXST/Platforms/darwin/soundcard.pyc": "2e2735a5da6e53b27d0d3dc8ebcc7f667f278de97a599e01df03f59f9cd52f21",
+ "lib/LXST/Platforms/linux/__init__.pyc": "449ce7c5eaa09566ca77dfdb255acdd0a8b398eb46c251135098ab209e12ac30",
+ "lib/LXST/Platforms/linux/pulseaudio.h": "7e0ef3774b7a32d4d6c9aa7431fe2e0905fe21762472786c009ce3a654b885a7",
+ "lib/LXST/Platforms/linux/soundcard.pyc": "eb26efec3f11d6a271899b792376790afc1451b59fd487af3dc26c8134553081",
+ "lib/LXST/Platforms/windows/__init__.pyc": "df5904c27d15b68d44c829f59215bd7d3eb702d8bd60abb1af4e9ff8bc5d4a1e",
+ "lib/LXST/Platforms/windows/mediafoundation.h": "554f0a53b4f8e38556ac1513f5cc0ae0cb022a43698b980aba456f10f28a325a",
+ "lib/LXST/Platforms/windows/soundcard.pyc": "209f1f2c05c9f843fdc027667d9255086960bc60d2cb156e48f6bfb9ea2f970f",
+ "lib/LXST/Primitives/Players.pyc": "8388709a2b9f5649115dc71e61b85ec299c5c2ef54ce67e9d2ceaa7e5be5a1f7",
+ "lib/LXST/Primitives/Recorders.pyc": "e97eb18db09f49e04d813bd518860bac7fbc8d6b6d6a4b62578e0b0d3e14339a",
+ "lib/LXST/Primitives/Telephony.pyc": "97202a0dee1ef1bea6e1e0394b4e9a8ab208fe6c685c5fd0ff9b31b972fa3368",
+ "lib/LXST/Primitives/__init__.pyc": "058952aa1b506b41592fbcebdf87af8b2e99dd55ddac9ba4e20b07c0da262fd3",
+ "lib/LXST/Processing.pyc": "bb151136ea68ff49aa77a04da63afdbefe6e2b48b6aa8a63847dc2c37bba3024",
+ "lib/LXST/Sinks.pyc": "db7058635f697c68e4760d05b433a28333b19dfeb796b3cb37227dd46408adf6",
+ "lib/LXST/Sounds/ringer.opus": "3ebb1cd472a2a812abb305a9a84cc1846d01568bc38a9843139928bac67a7ad6",
+ "lib/LXST/Sounds/soft.opus": "40c27cf33fa0a68ca19e92d7ed08bd9dee1bba2cccc9d67756cda0a1a6b88715",
+ "lib/LXST/Sources.pyc": "908879f22c36b596a57efd67ffb41bf79d915db1d69ba36f54e75b6d1dc42dfd",
+ "lib/LXST/__init__.pyc": "a805ef301058878874b64c44e845c8b4cee2e9492d3abc8126a09d38a44195f6",
+ "lib/LXST/_version.pyc": "1ee978520e88aa98bc9e756d2da35138ac63eb861f4cd36d733a9450d9e049a3",
+ "lib/LXST/filterlib.cpython-311-aarch64-linux-gnu.so": "5b3b878f455311ad6b7d4b095625b60d93177a5177cb4ff524e77b4222b7f055",
+ "lib/LXST/filterlib.cpython-311-darwin.so": "e0f4ecd1e10ee9b3958d38eb468f0b60e1843cbfb542122ea7d00ba9957843b6",
+ "lib/LXST/filterlib.cpython-311-x86_64-linux-gnu.so": "17c43af4f166660494c3ecae56282f441d292407d958beeb677f44338def1167",
+ "lib/LXST/filterlib.cpython-312-aarch64-linux-gnu.so": "4ff2da56abbb81d04e1866d7aa85d391251789f7e724857822a405a1a065cd00",
+ "lib/LXST/filterlib.cpython-312-darwin.so": "385f24564e42ecdd13c986ca67cbae22409e17cecc636c08989baa4d03ce8e83",
+ "lib/LXST/filterlib.cpython-312-x86_64-linux-gnu.so": "96ab07bbb5f523c4034b426ef371998a343afc3fea18a6cbc534b1ef51d257ae",
+ "lib/LXST/filterlib.cpython-313-aarch64-linux-gnu.so": "4ff2da56abbb81d04e1866d7aa85d391251789f7e724857822a405a1a065cd00",
+ "lib/LXST/filterlib.cpython-313-darwin.so": "aa2335b18765460ee0e547426e8ee1b282619aaef4c8b801446221130588a3b6",
+ "lib/LXST/filterlib.cpython-313-x86_64-linux-gnu.so": "96ab07bbb5f523c4034b426ef371998a343afc3fea18a6cbc534b1ef51d257ae",
+ "lib/LXST/filterlib.cpython-314-aarch64-linux-gnu.so": "4ff2da56abbb81d04e1866d7aa85d391251789f7e724857822a405a1a065cd00",
+ "lib/LXST/filterlib.cpython-314-darwin.so": "08fc0727de0156c9fd52ffdd7304878a49cf799d2febd19ef8fb671fca73630e",
+ "lib/LXST/filterlib.cpython-314-x86_64-linux-gnu.so": "96ab07bbb5f523c4034b426ef371998a343afc3fea18a6cbc534b1ef51d257ae",
+ "lib/LXST/filterlib.dll": "30411160c76e9650418ddb5ac86fdbc4663e7b71bbbd6575f2232dec1fe304a8",
+ "lib/RNS/Buffer.pyc": "ed53fb42dfff10b179ad4084b2695b2159c48bf906ded98ef2a480797a0e787a",
+ "lib/RNS/Channel.pyc": "7da982f5159db3c624353f00bd1cc669975ed4d31af76a07daceb9b17cc4a8aa",
+ "lib/RNS/Cryptography/AES.pyc": "70fb284c54cc3d28bfd27cd11283d51f9c4cb9641aa98b60bc0ea770dd27c145",
+ "lib/RNS/Cryptography/Ed25519.pyc": "d7fff5c54300427b33e2861fe61665709b46d9e26c9a5b3ec08916243eae288b",
+ "lib/RNS/Cryptography/HKDF.pyc": "c4e6eed44580156a61b3893f5db3622c619e28e9c451ddcb76efba04c8488993",
+ "lib/RNS/Cryptography/HMAC.pyc": "e81574d23eb623c1f6170476be4a6f289e0577d47de153a7e93bcde43630b545",
+ "lib/RNS/Cryptography/Hashes.pyc": "751ef4365177eb6ae3c48e98f941104a91176d45fde6e332716dac55ff40130f",
+ "lib/RNS/Cryptography/PKCS7.pyc": "58c55f80b74a6ea424ef617acf469f3f606a94de7edcab31d389ac5c18472141",
+ "lib/RNS/Cryptography/Provider.pyc": "e094b0903f46fe5188c86c5557475a037d6c42532c663ae60dc03f0d301d734d",
+ "lib/RNS/Cryptography/Proxies.pyc": "ee4169feac9dda12aa767331ed50b591428adeb6c607b45e85d32c9e8eb45b2e",
+ "lib/RNS/Cryptography/SHA256.pyc": "f8b364fa9477a4b8441b5058865275e3d154207fb76562724e8bad1f1b3dea82",
+ "lib/RNS/Cryptography/SHA512.pyc": "09de7e0c445a0a17d560cea1bc302daad7940815232c040f7e1087023b63f255",
+ "lib/RNS/Cryptography/Token.pyc": "959c176c68fe46a0a8dda807f420899c283439358048552470df631a1673b1e8",
+ "lib/RNS/Cryptography/X25519.pyc": "f6d9d5ed5649f73e539c63497185efa62cd1cc31e412c0549f32951af76bf99e",
+ "lib/RNS/Cryptography/__init__.pyc": "2f362a34949642147d77906fd5ec5b09fad7525c994c83757f19b8adb129677e",
+ "lib/RNS/Cryptography/aes/__init__.pyc": "55316ec98b22c5468e0f65428b7b69a147ee195b6ab2aa8b1498d7d268349748",
+ "lib/RNS/Cryptography/aes/aes128.pyc": "6fec214b5b8b36a3a9473b0105dc45ae8d2742b35faf0de82a374a5184dfd1f5",
+ "lib/RNS/Cryptography/aes/aes256.pyc": "b5b3d12a78d2cefb5493830d73dd1eda49984c788f94296e6cdf9647749b0caa",
+ "lib/RNS/Cryptography/pure25519/__init__.pyc": "c5be32350a6a87e0532e38809c57e2e8e8f0df8c7036f1b0a8400fa1c874a30a",
+ "lib/RNS/Cryptography/pure25519/_ed25519.pyc": "3c30b53de14a46f62baabc450a322791f7245465a4ee9f8813e07cd02fd7461c",
+ "lib/RNS/Cryptography/pure25519/basic.pyc": "1d51e1bf4531daf5300887981ebaccd253903e9ce5925973acd155579740bb79",
+ "lib/RNS/Cryptography/pure25519/ed25519_oop.pyc": "4faa1376044c618c167b6529f65c5f5c1979ddfecc3aaefd49b9229418c5ec7b",
+ "lib/RNS/Cryptography/pure25519/eddsa.pyc": "a87952dc9707c1d22744b883c7f403fc88822dddc1986b4c788b03941b7c6b7a",
+ "lib/RNS/Destination.pyc": "90d33f9a2c4bafb2f535db3e8de76f67836143aecfb1adaae4d7b4a236963523",
+ "lib/RNS/Identity.pyc": "095535372f45391e982470299903837cf7623ccd7b309ec5ea0439cda15c57bc",
+ "lib/RNS/Interfaces/AX25KISSInterface.pyc": "48cfee49c7fc0eb2015fa6c55904f0b3f36cfa89db3883775ac7aaddfe950288",
+ "lib/RNS/Interfaces/Android/KISSInterface.pyc": "2fe1528c83ce1eb0b7a6c1043fd53325bb503667ad44f8558708dbec4b3066a9",
+ "lib/RNS/Interfaces/Android/RNodeInterface.pyc": "8702037e05ca141e1048121f8be6841afbd46b561221036478883c77dbd9893a",
+ "lib/RNS/Interfaces/Android/SerialInterface.pyc": "122fbed38ae3af5d9deebc9b415684c4b0eb328e9d3b241fe411295ff242b216",
+ "lib/RNS/Interfaces/Android/__init__.pyc": "7e79bf911b3dc6c471f4bf234245bdc2b23b8d64d7a33a52f514de707ab11183",
+ "lib/RNS/Interfaces/AutoInterface.pyc": "4ad6756cce8398627deb91bb12aa8d831c9e9acc314fb08699ecc5d1186772ac",
+ "lib/RNS/Interfaces/BackboneInterface.pyc": "6a1c3234e775a7e2547cbf2435ff63419c809ff06262abbca790d2067ccaef01",
+ "lib/RNS/Interfaces/I2PInterface.pyc": "c0ae8c097906873a08466feae7bf45721e2df11825f1592c30f5ec734ce712f3",
+ "lib/RNS/Interfaces/Interface.pyc": "8a8a0e9d71a3b7a92cf87bf1aa27a09ae52227dd659252cb2c831d82f023dd08",
+ "lib/RNS/Interfaces/KISSInterface.pyc": "ebd2a73312021555bb5187b12bb0fb161781af52b777be2bf3d3f3066325f38b",
+ "lib/RNS/Interfaces/LocalInterface.pyc": "4945d82ec4d41a5de07618eff0d61a268d2f1e11e300a1e69b9d197fca8cab0f",
+ "lib/RNS/Interfaces/PipeInterface.pyc": "4edb85d898a171b376ed1beee91334ab2e3552447c723785fab1f7c2b2bc4317",
+ "lib/RNS/Interfaces/RNodeInterface.pyc": "d84597a265e5918c387036f14eb57f9b3caa25f299b84bd52b7e04f9d6c1844a",
+ "lib/RNS/Interfaces/RNodeMultiInterface.pyc": "870a35c88bac1fa240c7bdd657490d50a836840ea07478a41b45418c42d70aab",
+ "lib/RNS/Interfaces/SerialInterface.pyc": "8ef78b0d0bd7a4ec2df2d2a3b5ede66b64994c74ba803a3594a7f95e3fab73d5",
+ "lib/RNS/Interfaces/TCPInterface.pyc": "9be88ba76b2c16c1faaccb23733762e526a9e9cce02f8e51ab890a3505dfa129",
+ "lib/RNS/Interfaces/UDPInterface.pyc": "146376be7098abba59f49007b51a63e622e8336fecb7a6afe2edeac267838b5a",
+ "lib/RNS/Interfaces/WeaveInterface.pyc": "2e593d02a99aa04ef27778976f3f9cfd2950a1d49771e028b9703c63bb6eca5c",
+ "lib/RNS/Interfaces/__init__.pyc": "84a76244aab715c27e2d771b6bd7edc1149f9255e104ea32e673bf56e4afe5c8",
+ "lib/RNS/Interfaces/util/__init__.pyc": "676139600c93a45acd30c2db45a7e13fc6cd1378fea614a8cf7d20d2f421645f",
+ "lib/RNS/Interfaces/util/netinfo.pyc": "d726f74ffc911d3cdf3bd7fdf5626c515671172bae601d443fd9b2fab8fefe44",
+ "lib/RNS/Link.pyc": "09015a1e3b8d8a69c564eae0a2303e0cc250e88e0071a27a2cb3949d86eade93",
+ "lib/RNS/Packet.pyc": "e2c2d1e684236c8eae640297f050f65f8768d902c6bfba1c92ebe33eaa4f54cb",
+ "lib/RNS/Resolver.pyc": "d84cfeb6b60fe24b591f1da56942a0dba2bdb7f80feefce718229ea3776eec10",
+ "lib/RNS/Resource.pyc": "54477d87f078984f14e804883f51d7079033b2593d3b0f37649a1b2d3e9de904",
+ "lib/RNS/Reticulum.pyc": "427bf50af7faca0835cf314084ec5eb7015613f1d808518513a1033d392960ff",
+ "lib/RNS/Transport.pyc": "0cbc39333c93ca3b0474cd4a204828a6e90cb07411e8030a0e8fba87053a7500",
+ "lib/RNS/Utilities/__init__.pyc": "6c34814585e6b9bda7132b38e527c5c77573e3445daf785fad25e9e889dfb866",
+ "lib/RNS/Utilities/rncp.pyc": "1be237b38725c84396c64c449f701ace6f3dccd122aa5989c6cb1e59cb5b6eb6",
+ "lib/RNS/Utilities/rnid.pyc": "6068062cb718bbe51af667d2d1e1cba943b885a402fc7ccab7a0229441326fb0",
+ "lib/RNS/Utilities/rnir.pyc": "5a99c0efbe2c2057143794c715c4211081b4b2b0c0fac1695355bb530e5dabe2",
+ "lib/RNS/Utilities/rnodeconf.pyc": "8f07ab11b5f30462ffd7a84f1c3f929dcfa1017e132dc46b9f62ef69dfc1f37f",
+ "lib/RNS/Utilities/rnpath.pyc": "1fb252e6a16a62c023d62041c768a9394a5d61c02ef24ddb65272811300c1875",
+ "lib/RNS/Utilities/rnprobe.pyc": "a6ee36ad99e7de0772070bbc3cd9bac32952f75d90d16ae0517fd9ca40b9b856",
+ "lib/RNS/Utilities/rnsd.pyc": "67589673e2808bf507fe56cf72c5555ee7d733b5dd95ad06232aed657622a591",
+ "lib/RNS/Utilities/rnstatus.pyc": "dec25f9cba8f12f90ff5f07680f4c00be610415a7f4d72d6b2806c95ad2b64bf",
+ "lib/RNS/Utilities/rnx.pyc": "a0e5e3ece70f55a8fe0bcc192ad924e4a7dd0f6f65288eca3e2c62cdbabe45c8",
+ "lib/RNS/__init__.pyc": "4f05600bf585ca8295b5d83080e50638c461542d690ec5136a001f200147d219",
+ "lib/RNS/_version.pyc": "fe05aeaa0b837505b59fd691b6ef368d168e16513b18fe656a86f62b5b9aadb3",
+ "lib/RNS/vendor/__init__.pyc": "2bf3713f65f2c7091d60a86d916a8d9cf187de4241438423f4d584f48c4142d9",
+ "lib/RNS/vendor/configobj.pyc": "b678374e3484668ffc1525b837ca2b7d4ace4436b5f568f5db08983fea2e78bf",
+ "lib/RNS/vendor/i2plib/__init__.pyc": "5054871843488910c86c8b939288c934a736b95ae0886fe0c7cb9c9e824047fa",
+ "lib/RNS/vendor/i2plib/__version__.pyc": "0966c00b447b18e2cb998a324e4c735e11ff04c657afad19ffcbcd8144898c14",
+ "lib/RNS/vendor/i2plib/aiosam.pyc": "ef44d5194c983b45056eb098261d19bc986696cb2f85b8d3c634115c8f060f9b",
+ "lib/RNS/vendor/i2plib/exceptions.pyc": "5707a5f7bc1f509c9d799760b4f9f69f11e06942afd027afa79ab8070e8be65c",
+ "lib/RNS/vendor/i2plib/log.pyc": "04b4d68b9206bedd74f97626e43584b4b43b2776997ec6c2b0d221aca39f1212",
+ "lib/RNS/vendor/i2plib/sam.pyc": "d042c9e38e1b3f1f9d2fb7bae91fe82c0a7bad417fbc9c1354cc7492df8dc51c",
+ "lib/RNS/vendor/i2plib/tunnel.pyc": "e8a9e1a461512ad23d96f13e3630d52667142099c2ae0a59e7c422e2a58b3941",
+ "lib/RNS/vendor/i2plib/utils.pyc": "181e87ef6a6c4dbb08142c473e2e0650e30572c89d2dcc0026e369b9925b4833",
+ "lib/RNS/vendor/platformutils.pyc": "727d528b315568fe3530f4cfb92fc498fe95b60680779d7d57bd44d8dda45481",
+ "lib/RNS/vendor/umsgpack.pyc": "340d97a1542131ae13b17f99852c54adb27e7fba60c9a18ae753643cb52afdb9",
+ "lib/_asyncio.cpython-313-x86_64-linux-gnu.so": "51725a67046cd599d66b764c90d360df4d29e7bef725d62fd8bf72a5d203d7a7",
+ "lib/_bisect.cpython-313-x86_64-linux-gnu.so": "972df620dbbf776689fd3f8df4ab10ca5a3076af21cd60c812f3a3517ee6c825",
+ "lib/_blake2.cpython-313-x86_64-linux-gnu.so": "f78705401256c665f57033c634ae28995530f16ae5d557c17f0dc128d2d09698",
+ "lib/_bz2.cpython-313-x86_64-linux-gnu.so": "9dbadeee4af06be11affdc4bdb5780e0e5a8d7d7f02cf75b36bcea3d74e85d0c",
+ "lib/_cffi_backend.cpython-313-x86_64-linux-gnu.so": "4716712759d392db6b741965c28e4310c12ace1d30af457fb1bbe6eb53cd74a8",
+ "lib/_codecs_cn.cpython-313-x86_64-linux-gnu.so": "f8f13fe226a45f223675aea31af6e52218ac6e383e4e555f0d4ec74f774f61c2",
+ "lib/_codecs_hk.cpython-313-x86_64-linux-gnu.so": "8beeaf5d2bf69cf5f4e8d66edd3b84e8c938111e43d4fd5fd1c79473dd050f85",
+ "lib/_codecs_iso2022.cpython-313-x86_64-linux-gnu.so": "dff007f1f0fefc89832963500102cf08922d189e1e8b27ecb75d54bd07c6f1b7",
+ "lib/_codecs_jp.cpython-313-x86_64-linux-gnu.so": "51f266342c185042523f9e05b17c3c7eea9fb3a259f68bd1a0525d0980705824",
+ "lib/_codecs_kr.cpython-313-x86_64-linux-gnu.so": "ec3fa0d99c5d841cf34a0eaa9d8f54a1b5d0041368a85eeff869b6e8aa051f8d",
+ "lib/_codecs_tw.cpython-313-x86_64-linux-gnu.so": "04b3d1d2513a45d449fbc1d2b8feba7b07b1b0b91edca9d36151b14d8e808b62",
+ "lib/_contextvars.cpython-313-x86_64-linux-gnu.so": "abc8fa37c2bf485582dbe883eac21e1a49cab32aee11ba72537e2cc3106e70c3",
+ "lib/_csv.cpython-313-x86_64-linux-gnu.so": "2c6ad82fe1fb34703b86449cf89c5e62378b209dd5647e5a4cd9ad394aae377d",
+ "lib/_ctypes.cpython-313-x86_64-linux-gnu.so": "991b63be7ff14aa4278cf662365aacfc4afad4554ed1e39865e70ce24ee96061",
+ "lib/_curses.cpython-313-x86_64-linux-gnu.so": "6fd228464cb6d61105059431da8f24683b1d47d1d0720473346fdec5adf29069",
+ "lib/_datetime.cpython-313-x86_64-linux-gnu.so": "82c83f9bcaaea38bdb374a5ad4f62e1822b0481fc6e59224813b9158d4da5cb5",
+ "lib/_decimal.cpython-313-x86_64-linux-gnu.so": "7eb0af22e5a866ac3cf7412bf4bd157a5114df9ac888ba49eb54a3ed61f6a30b",
+ "lib/_distutils_hack/__init__.pyc": "7f8a888ba104689b707fe1af06b667fae294bbeeab99b91954ac1d1a91c0ea2b",
+ "lib/_distutils_hack/override.pyc": "3d7372f60c3cc4996a29e5e70fb8d560b0aca8a39c98c0475a4479df78d47392",
+ "lib/_elementtree.cpython-313-x86_64-linux-gnu.so": "73e7848c9f900e6a0ba9bff034c5e11068bd46f6ce98a005ccce3612e12b4ce0",
+ "lib/_hashlib.cpython-313-x86_64-linux-gnu.so": "3f80e2989c979901ad7e9e7d795c60bcf0d1b45cd133556131a1a1c432f722f3",
+ "lib/_heapq.cpython-313-x86_64-linux-gnu.so": "e5abbc4e6d74608adb68ee1f6f33d7d5f1794a3e1c0a4d1753e483b8b8ca838a",
+ "lib/_json.cpython-313-x86_64-linux-gnu.so": "52c060b43b08e5bbc4664bb2a4a198903f67d186bc65db664160c42573327fa3",
+ "lib/_lzma.cpython-313-x86_64-linux-gnu.so": "412466e43956c0d8e75919e69d2ddfd37d60d179a6f379bd3ecfabef384d61a2",
+ "lib/_md5.cpython-313-x86_64-linux-gnu.so": "44d5cfaa0450cb65c323637dbb028a96203117cd7e0f4f1f67cc71032d03418a",
+ "lib/_multibytecodec.cpython-313-x86_64-linux-gnu.so": "c0b5bb3afa16605d0c8d8ed0680577763f3f886d4b67d703647858d8b77186ab",
+ "lib/_multiprocessing.cpython-313-x86_64-linux-gnu.so": "b0e738a5a84b9bf2bc7f6f3074ed5ac6650fd56f7d3d853830a36d61e66e68a8",
+ "lib/_opcode.cpython-313-x86_64-linux-gnu.so": "00ea2a7a02e8c825de215767807f9f5ae3183574e456f6e02026dccfc9d923a2",
+ "lib/_pickle.cpython-313-x86_64-linux-gnu.so": "6018f20614760ae0faddc236761c047548a589b973b37c8507706e1dbe9cc8d9",
+ "lib/_posixshmem.cpython-313-x86_64-linux-gnu.so": "8912d63fade49dd18c33c5859a27dd7816a728293a5add98a4e33aac2736879f",
+ "lib/_posixsubprocess.cpython-313-x86_64-linux-gnu.so": "e8d2ebf716b36c128da9f3006099e92c7e1e13940ce3a94dd16d2d907e54f728",
+ "lib/_pyrepl/__init__.pyc": "5aacfb2fcacb3c8626cb7e10926c0a3ded501211582c2d5fd92f03534cf85810",
+ "lib/_pyrepl/_minimal_curses.pyc": "6d9cc212a0b020729fe06bb31234e40e1e13fbe65ae1161a1882f145cd2a4ce3",
+ "lib/_pyrepl/_threading_handler.pyc": "7e0ee7f0cd00e31f3f17f09f8843b544fdbe785ab3bb7e9c877584da0629158f",
+ "lib/_pyrepl/base_eventqueue.pyc": "3094fb40111ed58948cefd0d26a66ecb3bebcf696a2e5fc4f8f3126911129e6a",
+ "lib/_pyrepl/commands.pyc": "16ef8b5c03f30dd953cc1dff1bec47d764621cb954dc493d65061bb2ec166f68",
+ "lib/_pyrepl/completing_reader.pyc": "b2653f6f77711ad502f5ce4bbc22035e63c6125833ded9cec129d51f66935432",
+ "lib/_pyrepl/console.pyc": "b3286a100ff070c92753f1e7c630439cd48557c1bb63635c2da802a5fab78e5f",
+ "lib/_pyrepl/curses.pyc": "d421c628d1973d0c405c5ad183e63b8c60172f2aac083d0d74f42f58a76cd672",
+ "lib/_pyrepl/fancy_termios.pyc": "dc6cda7ca2cf030795bdbf1fce9cb488e2fdef52e26932239d363d9ba0566e1c",
+ "lib/_pyrepl/historical_reader.pyc": "da281af2d986470c6dd8d56135af048f5423125e560f7892dda80e99a44b679f",
+ "lib/_pyrepl/input.pyc": "f0d2443689cbcc6072408199082d9cfe4cd69902d52f84365b013f36724e7a4b",
+ "lib/_pyrepl/keymap.pyc": "46f08fe7addd9fcc6b6d8642fcdb69b58ef53b6accef38b957b7368989757c8b",
+ "lib/_pyrepl/main.pyc": "1df72bbfe11cece19b11c6d7ed249236fe0b7b7f84fa92c7ea06bc5509d1685c",
+ "lib/_pyrepl/mypy.ini": "031601420323bb94aca7befe8dad6e9d2af13fa6994ed98c3a93ac84890a499e",
+ "lib/_pyrepl/pager.pyc": "4370571eaa454a98a73f0fe0fc9d27ed12649ec92a3b1ed1556bb83e069b292b",
+ "lib/_pyrepl/reader.pyc": "8e74707288af9d5f2a694b0d622f20a1e2660bff703a0abe9b050f8c45be04e0",
+ "lib/_pyrepl/readline.pyc": "744451cc88e2aa50845604ef0cc97c65cee13292d8b5b993362eb2dc77f75f80",
+ "lib/_pyrepl/simple_interact.pyc": "4d1c696213c126807fd560e558991d48386dd73e060d1973d0fc5b02370e7f46",
+ "lib/_pyrepl/trace.pyc": "4800f9d624672571005815bd6183a955275c877e9f376c092e3356b863ae44e5",
+ "lib/_pyrepl/types.pyc": "b3cc471e0bbb4d27ab5dc7b43480d2a368b41a7f4b854164b1ce171562963368",
+ "lib/_pyrepl/unix_console.pyc": "99b2d58d10e00addd7b8d237a2c7352e36cddbaa6f5fdf4e04a585f22caea4cb",
+ "lib/_pyrepl/unix_eventqueue.pyc": "0426f676ad67467d8ede30c64c64bec07c22208797d4727e17304c2c872e8491",
+ "lib/_pyrepl/utils.pyc": "012b3f07b4a9ae5f0aff1e1d8c950d69453070faee63316dece38415f75443f0",
+ "lib/_pyrepl/windows_console.pyc": "26ab6ebfc026d674906129500a075053b750496a0bc367acd8a1d08f37c0fd17",
+ "lib/_pyrepl/windows_eventqueue.pyc": "9a26d47327c4a19b287cd8f7ce452c8724335ffba673a653b26eb67e28bbf6bc",
+ "lib/_pytest/__init__.pyc": "9ce5027f107a0ddbd09c15ee09e2d677ec1bb9988e34c8645f116c082d8c9306",
+ "lib/_pytest/_argcomplete.pyc": "4114c39ae194caa3d626c0836ab8983dfe3033864aa3a2455d833e90fbe28ef2",
+ "lib/_pytest/_code/__init__.pyc": "8efc831307e7cbaab01b4ef165c1e0b40fd515383785ced848fae81d51c9a621",
+ "lib/_pytest/_code/code.pyc": "26f17d5da78fa6a2a993259d88106d0a3e66e9e712b47527434390089dfa933d",
+ "lib/_pytest/_code/source.pyc": "7a5753f2a5dfe08846317bfc2095cb783b49aa49ad3b67ea3244f147785abe5d",
+ "lib/_pytest/_io/__init__.pyc": "be8438c325f54918d0d79c2ab4c7e231ee2cd7c8b02a08d79b5fd20cf5a5d990",
+ "lib/_pytest/_io/pprint.pyc": "a74bf4a44099092e3d35630b6f649e626a8469882945c6172883b6c6d3e5f414",
+ "lib/_pytest/_io/saferepr.pyc": "48e93a0d5b0eea30d1d4cfda8cfcea61cc2b3cd702a0e671ebd52b44bd1fd82c",
+ "lib/_pytest/_io/terminalwriter.pyc": "fde707049f944cf525bfe8a5ec2004a9f139d79e3826863ddcab2e19c1063516",
+ "lib/_pytest/_io/wcwidth.pyc": "ab274b6930e92c3435537e0779aeb857472d742325ba64ae99817ae5ab8d2dc4",
+ "lib/_pytest/_py/__init__.pyc": "aac35b87917f464e4d4af2e0708e7058934de1c4b4ee281a0aebf877163b70f6",
+ "lib/_pytest/_py/error.pyc": "d4a8e165fc2b4fd4a5e163ff1adb1ed800c2c3204f69a4db3c7aca4e2024ba31",
+ "lib/_pytest/_py/path.pyc": "4eae11a3118681667fb24d06d6a4481f1fde56006103462765ac9efe35062b30",
+ "lib/_pytest/_version.pyc": "92e062094462f3d75feb1d520731f591745ddfd256f1df1a101ef20b6fd52f93",
+ "lib/_pytest/assertion/__init__.pyc": "fa37a7c36c304f560999cdbf734a1017f5c189a32d645437c2a070d714e07c5e",
+ "lib/_pytest/assertion/rewrite.pyc": "bb8eaefb532621ffefd34dcdc8bc299ac0d25648f9533852891c1e50059679c0",
+ "lib/_pytest/assertion/truncate.pyc": "955445622c151cd300b3792e4ae2939e89247f2a4e41cecc8e961893ed01ce6f",
+ "lib/_pytest/assertion/util.pyc": "8e6fb72edf0340f4c97c6ff842f26c3a32d9402a626b9a52dd8a4ec295ad4dd1",
+ "lib/_pytest/cacheprovider.pyc": "282405b6b61b00edf0f56ac2ee710904d5bdc7cedba282b6827d83e93d1fa9d2",
+ "lib/_pytest/capture.pyc": "55325015399c338c79db198cb32f46e5a20a562d1764aef5daea5d47d57ce042",
+ "lib/_pytest/compat.pyc": "0a699c1f83a54f6c79861e2d0fa3ef8ee3ddbbbd2f96f184d893229545f6d9a8",
+ "lib/_pytest/config/__init__.pyc": "90eb8b827e58a75d8dd9b235a7f2263fbabc838b2c70475dddde95e1e3a64522",
+ "lib/_pytest/config/argparsing.pyc": "4e751b257706fcb55484416c1a7de5d7168028e867698cff009e65f15d647ea0",
+ "lib/_pytest/config/compat.pyc": "bda1c874821f4fe9d5e9183da6effe6318c93ce30e5c777345c8c7c1cc0d63cb",
+ "lib/_pytest/config/exceptions.pyc": "9bd2ff8a86a12a44846e24469f0a03db64483e2dee6787002031250b8c2f9c58",
+ "lib/_pytest/config/findpaths.pyc": "5bb9ea26ed7ac8a29b31e2200e72e4dacca88448e07b1fc7e5f974b499d56046",
+ "lib/_pytest/debugging.pyc": "3250c9d45d9faa35300d4d11a4718f13548615189774979e0d06527452ee62cc",
+ "lib/_pytest/deprecated.pyc": "8def2f2f560cd73d86305f266cd326b6d4237076ad4744ee0f5c3b8212da96e8",
+ "lib/_pytest/doctest.pyc": "0b474942486063352998da9b698a7957101b6988adc3352ff652e921760715b6",
+ "lib/_pytest/faulthandler.pyc": "c45e530194225df737f7b95f1ca8495b610ed4f2d17e1b2c8637c16378188898",
+ "lib/_pytest/fixtures.pyc": "321be9498781cb5451f96e3f714281bb4382ee7cdf9e9f754ca13944b30370e6",
+ "lib/_pytest/freeze_support.pyc": "0a4e597aa5717f505f6e7e70fb079a487f897c71db6a73c009c94f320b8c39cd",
+ "lib/_pytest/helpconfig.pyc": "d5f9254fbc0cff74a1ea805331472871b40dde443d9090c35e08e01d0ad99fb5",
+ "lib/_pytest/hookspec.pyc": "9cb1dc5980e8b224516829cb63aa06579e306b782152999a3e7a51049e83da83",
+ "lib/_pytest/junitxml.pyc": "84ee764c5868f999f8ba06a2f8c0b7ff9e134cd502e1e5f0bbec0e1932d586df",
+ "lib/_pytest/legacypath.pyc": "9ef239b75e4febeb422ea221ec04653d26ebc2cfd0dee84b3081ada9069f98da",
+ "lib/_pytest/logging.pyc": "76261d9fa5308c4f13ac5b0d2d2fb99a4bb9391bf9650240a7e74e618296101c",
+ "lib/_pytest/main.pyc": "6963b26414a8712a43c0916b57ef2592bf54d4be8a1c5197b51415a57bfd274d",
+ "lib/_pytest/mark/__init__.pyc": "62af42c9f0e454ff25774a71d74f613af656b8a99a4f367624ce4f711a2ac9a9",
+ "lib/_pytest/mark/expression.pyc": "f2e803f68394f87d90eab868ee63cf105d5ab0b124f21494ec80c9621e89ffb0",
+ "lib/_pytest/mark/structures.pyc": "c05b7d90053884bf32f6c99152fec34dcead76befbb87f27b28d367395a51a32",
+ "lib/_pytest/monkeypatch.pyc": "1832cb6dd69fc88d77fa0cad2ca69e296ec579b3dd7fb3b3a0223b2d0bc56edc",
+ "lib/_pytest/nodes.pyc": "dc35f289fac8ee5e9c9056a1e687993e6c5c96f42329a3f047f3b58dd0c2e8a2",
+ "lib/_pytest/outcomes.pyc": "b16f979563a2c479630f0e4e3c4fd233402d20ee3f6be856687e5c9ecebce013",
+ "lib/_pytest/pastebin.pyc": "bd0ea023c771ab9bfa27797d9b87fac5fd705dbd32d3ad3a93915a55062b40ec",
+ "lib/_pytest/pathlib.pyc": "7511644ca2a9ae5e799627eded01b7b65c86f64e69a8c521553449ffa323a752",
+ "lib/_pytest/pytester.pyc": "a7388ed97655ad8c877f7b9a6f79b31e5fdda9a95cf2de31be7a8550d3a2a6cb",
+ "lib/_pytest/pytester_assertions.pyc": "dd646c219407bda501132b9229e6be2b67fa96ddcd9011f4f48c373d123337c6",
+ "lib/_pytest/python.pyc": "0d78aa47c9041f052886f4043322c580db03173f2cc8ac5ec2bacfcf5ffba9cb",
+ "lib/_pytest/python_api.pyc": "e02aea39c7278c79fdcc6f05de43d3006886feeb151fb99283bbf6fe6cbf99f5",
+ "lib/_pytest/raises.pyc": "4811b827c2ace02076e04df0434d666133a544adbe633c58088e8dbafacc88c2",
+ "lib/_pytest/recwarn.pyc": "de413d52ba6732bcda09370fadb0f17a0ba9fc87243abf2ecb89564fe98e3c77",
+ "lib/_pytest/reports.pyc": "9750ded196386350aea2b8b84333977720ffbe112fcc400eb66b4113103473e9",
+ "lib/_pytest/runner.pyc": "489b8471ca667385cc9bfbef2b8a6c204b58ef6ac8efa526484f69b3ffec524b",
+ "lib/_pytest/scope.pyc": "08dccbb770b15b3dae2fe62d651643d49995aa575662091137906e0355573aee",
+ "lib/_pytest/setuponly.pyc": "edf6f429a8c92e4576a370d2a709421939c72aac3d0cad41ffd0cae0d6e0c561",
+ "lib/_pytest/setupplan.pyc": "8f9068f51d37153f6e5e540818ec8ffe3eec04547160b5a4072f61cb27d16579",
+ "lib/_pytest/skipping.pyc": "8ed7015fe8200eadebd0f0b4ba9d35344f112f2a8a2f83c92cf66f485d926588",
+ "lib/_pytest/stash.pyc": "0fafc3f0379906defff0a440187da66e3357a5dba417e7158b6c02c719327a18",
+ "lib/_pytest/stepwise.pyc": "3a29f3c7d4cf077b11eb36b190694bd26b6490e426fc1da4c61a8c5fa76b3db2",
+ "lib/_pytest/subtests.pyc": "e9198140d2b6b3b042e75108eb9b4cfad17a304fa42ba95f2d1d5a3ad812b0da",
+ "lib/_pytest/terminal.pyc": "a089a2f6ebe0c13e8fb3495d1ce471d25b7210affc89c8dc2cd852d7f41a397f",
+ "lib/_pytest/terminalprogress.pyc": "390710277710110ea168001940a01f3979d03d89f1a8b63db6689606d158a8ba",
+ "lib/_pytest/threadexception.pyc": "8c7eb43abc542b225eca4416c111088fc2a88ab7b13b70942a6dacfd0ec7c40a",
+ "lib/_pytest/timing.pyc": "385007b45d63201bc7b2f2a81ebaaff52c38b783abd22ed50516c35b85f28e7d",
+ "lib/_pytest/tmpdir.pyc": "91a945e5be00d6ae78fa6aed51362a10a69210a7216e31c8fadde1ab6e6e9f00",
+ "lib/_pytest/tracemalloc.pyc": "f347f15f5bc8231574ee5158b99cf46264ca36eb2abce35b1e2b94f4921e779c",
+ "lib/_pytest/unittest.pyc": "bc318e8a401edcf25befea4736540fb26a942798dbff50071c5e816c5aeea2c4",
+ "lib/_pytest/unraisableexception.pyc": "855b0adf117611a7b7aac4cf132a243e5d35cfd20be2b47c573d1ca8572ba189",
+ "lib/_pytest/warning_types.pyc": "0a540190eef5978a83bd36635221219b01590a93a132c024b4f8a29291289d5c",
+ "lib/_pytest/warnings.pyc": "193bc3f2d6491043309ac9defe2ce2acd4da4a7bbac391b746349ea1f3fd3f8f",
+ "lib/_queue.cpython-313-x86_64-linux-gnu.so": "845ac5850526cb01be5dfa7a22dfbab6ac667ddc1d302cc0ecd6cd47e4b1b551",
+ "lib/_random.cpython-313-x86_64-linux-gnu.so": "ef4ea1f17f18a5b75e892f43c13a035ac87ba329e578d1ecda2b9ea9f3b484f6",
+ "lib/_sha1.cpython-313-x86_64-linux-gnu.so": "b96866bc169f1dcad443152a7793e2170b796375413a5c151cc5a0d6faef185a",
+ "lib/_sha2.cpython-313-x86_64-linux-gnu.so": "9d410aefabb567bffbdb40d6dd7c95c51606241cd176ce2db149d0502b8455a0",
+ "lib/_sha3.cpython-313-x86_64-linux-gnu.so": "981ceac4b8c865856989167a1957a39506f39e78806b7916b5625bd8d5a360f4",
+ "lib/_socket.cpython-313-x86_64-linux-gnu.so": "7151cbf809c2eb453af6b3a68cb1c50799a5fcae73a9539354809a88931f201c",
+ "lib/_sqlite3.cpython-313-x86_64-linux-gnu.so": "bc9e073296945a6ade1f72639225096c3e0c672933d4a2465451759265caa625",
+ "lib/_ssl.cpython-313-x86_64-linux-gnu.so": "940c02cfdfc0ed2163179b5bad699cf4e9e7ad6b7b95cfb606124f5a096a7e87",
+ "lib/_statistics.cpython-313-x86_64-linux-gnu.so": "0591dcaf3805c1b76d76f7a2b3509fb998b09a0b68a87a6d86efc104900186ac",
+ "lib/_struct.cpython-313-x86_64-linux-gnu.so": "87e222c32c9aaf792e63b9da638da1c11f24b8af765fe3a1ed4d5eb9d49a9038",
+ "lib/_uuid.cpython-313-x86_64-linux-gnu.so": "fcab30adcec4e0c3ec4fd9cd06f97e03c0bc768109df0bff3e03311675c9fa4e",
+ "lib/aiohappyeyeballs/__init__.pyc": "e3770eb11d98275e8cdc59722b059517355adf0c664c8f5c551eae3e216c8fa3",
+ "lib/aiohappyeyeballs/_staggered.pyc": "497ded282a87bfb901a526f32e6787bba5b40705b4fc5b135d794ff2a07e3bee",
+ "lib/aiohappyeyeballs/impl.pyc": "198e412fe25f40cce4768b7be92eec7fd7b8bd97e1fe5826fcb20aaa7ffb7592",
+ "lib/aiohappyeyeballs/types.pyc": "f963e38f20482594dce16f291c6cf07524453ad8a17bd5c741e50d3b6689eaa6",
+ "lib/aiohappyeyeballs/utils.pyc": "2239977da2752cf19a6d435930b0e32df10d2ba4081760a542e0e297a2322dd0",
+ "lib/aiohttp/.hash/_cparser.pxd.hash": "a63b3eb045cdc3f7a28d718079dc06f811e7945a7c07bb0e0a051a80859a5360",
+ "lib/aiohttp/.hash/_find_header.pxd.hash": "fe66e90fabccf825422aadee954bec380cf959da3cf30ac3cdfa4eb0c41a30d0",
+ "lib/aiohttp/.hash/_http_parser.pyx.hash": "8eee031bfb8dbfcad30faa6edc8ba7135cacc7765b1f83a38901d46ff5114a80",
+ "lib/aiohttp/.hash/_http_writer.pyx.hash": "f6dc4e87bb7b737cbebcb9a2b84639765b665ef128d0263253853ce77cb2bfd1",
+ "lib/aiohttp/.hash/hdrs.py.hash": "bfa21a29bb318ec750c41ce16f90233f4c7ff46deb51ef380fb6af7fb008e1cb",
+ "lib/aiohttp/__init__.pyc": "f6c2edac228ef2b911ba5001f4604fafa2a4909a7a6d2688750f9d941dd25cc6",
+ "lib/aiohttp/_cookie_helpers.pyc": "22ab6c4c38ce5b7856e9cca8b9273850cd5df3bd7cc5b4d04c0064f1d1c6564f",
+ "lib/aiohttp/_http_parser.cpython-313-x86_64-linux-gnu.so": "697bd90559b7622efccd2ee06cf2739f6b77ed0ce5d22af22a53179641397d0d",
+ "lib/aiohttp/_http_writer.cpython-313-x86_64-linux-gnu.so": "8736b519e3a8fe5e752e824462ad124821e5012069ee443e1df8550f0c2269b3",
+ "lib/aiohttp/_websocket/.hash/mask.pxd.hash": "634cc175d93f724de98bdf8117331ca6472f08abf0bd9e064ed6456fdbb59f14",
+ "lib/aiohttp/_websocket/.hash/mask.pyx.hash": "f74a30a5760cf3f90899ae0a51c3b18564a4f94bf8355301a0261e14cd41dddd",
+ "lib/aiohttp/_websocket/.hash/reader_c.pxd.hash": "e717f7a286e4eafc78c5b266fb1b59d7f42e7c1f1f605b4b415d8c35da94735c",
+ "lib/aiohttp/_websocket/__init__.pyc": "7805951be217b568209d7ed502339284758d5d31d18b832c2f2a090d24898389",
+ "lib/aiohttp/_websocket/helpers.pyc": "5970732739aaf9522415ac448f98f95938f68b6cbb448b12d563f5c3ead4e4f0",
+ "lib/aiohttp/_websocket/mask.cpython-313-x86_64-linux-gnu.so": "7b61199dcc3562746e2109fd3bff9e652a2c7607ba8b0a86d7c72475ea9dc759",
+ "lib/aiohttp/_websocket/models.pyc": "d94b4bec024acd8969c815d9d721d59476e33a21e7875f71077cfb7176124932",
+ "lib/aiohttp/_websocket/reader.pyc": "71048d60c0b79244bb3da6353d8501462f365b0a66d6fdeb0331f703a62d006f",
+ "lib/aiohttp/_websocket/reader_c.cpython-313-x86_64-linux-gnu.so": "fedaf70e88678ff114a0918890e552f6af40931abf58747c649c2cd56ed0435e",
+ "lib/aiohttp/_websocket/reader_py.pyc": "a27d41a86fd347f110aceeda80fd0406cd7e2ceb89b6c724c5f3d6be87565995",
+ "lib/aiohttp/_websocket/writer.pyc": "b1071edf7a49d048f9014efe3a3aa717d223da80432943bf374a1399686570a4",
+ "lib/aiohttp/abc.pyc": "8eb51be9dcc6795fd86f2e63353a494489c803d50e43433be73435a7df9b903c",
+ "lib/aiohttp/base_protocol.pyc": "388f43d774cfd13c1ed6a1c3d92a589aeee4e3f7c33a8812e434cdd2bb52083f",
+ "lib/aiohttp/client.pyc": "fb5f2e35bd99b502bb82defeb343639e945e7141b49f85df606c3a76f9a92250",
+ "lib/aiohttp/client_exceptions.pyc": "9ca276967149ea894e85ae748fd4c4d7a1addc3f4e44121fb653f875c4847e00",
+ "lib/aiohttp/client_middleware_digest_auth.pyc": "300342cb45d1e6085ff59eec1ee12e80a93a9cfd81e067e4950f02342a8a0be2",
+ "lib/aiohttp/client_middlewares.pyc": "ea5730f06d8a0d756dbbb55a010e9945cea7011b16980a1e6a02069e4f15bcc4",
+ "lib/aiohttp/client_proto.pyc": "17d7145503cd8cad4fdb3033326f7b4861801d6383fba82a780d306a3b0e906e",
+ "lib/aiohttp/client_reqrep.pyc": "5048e7cb83de87488f8887a355158923d10d5b47a0293e6bee58a1e878d2f09f",
+ "lib/aiohttp/client_ws.pyc": "6cec970505d5e62635d196e40c5c757f91c29fc2fb4abfb3b5849a69a020aa1b",
+ "lib/aiohttp/compression_utils.pyc": "a4f9aa4ed4af193d6d40aa862ac1060c5926b40c909b85aebe3f89b80d1b0fdd",
+ "lib/aiohttp/connector.pyc": "df2ea9b90ccde6a4303c7b89207a9140fe2b568ed8c884eeee29638928fe605b",
+ "lib/aiohttp/cookiejar.pyc": "c012cecd27b64f13d3466d2a8fcfb4d80763deafa15263c158d2576eab612a75",
+ "lib/aiohttp/formdata.pyc": "a0d00e7cfbb9c585572b096ad95840f212d5d8ed39b5331a8f81e8c7cd939825",
+ "lib/aiohttp/hdrs.pyc": "a940a39ca9f8ef059abbba83945236fde6bd74343952c06201b0449cd74170c5",
+ "lib/aiohttp/helpers.pyc": "8439e842e4a0c467f1630cf7cdf40680c681f7bd5454aae94968c17c14861686",
+ "lib/aiohttp/http.pyc": "c11009368d0817f02f4d456d950e681fdda16cf17164fc46235dbbe89955444d",
+ "lib/aiohttp/http_exceptions.pyc": "8fb64864e9d71a079a4115dc5ea419ed0be2f1859e8dcfd2261ef4aa3d791800",
+ "lib/aiohttp/http_parser.pyc": "407f7483dcf313c6bb82bcfe43b20163f500d1c6fa84ff0915b3d919f996ff89",
+ "lib/aiohttp/http_websocket.pyc": "6dfb5d805fcb5aa7eeef3cc8c1ea5f6adbc53d684149125ce6bce4fbd3ba4c01",
+ "lib/aiohttp/http_writer.pyc": "c78f886493708828940a4f90a5e9bdb8f0ec46202140983e03cd5b0589465805",
+ "lib/aiohttp/log.pyc": "3cb179125ca655be5b06ab5325dc635fd0d0771aaedb31fdcd5d31bc6336438a",
+ "lib/aiohttp/multipart.pyc": "db5ab1b512a2149d50c0901294afc3f23135384700fe94b8f2159bfe5218f242",
+ "lib/aiohttp/payload.pyc": "75002819216e62ce1db0db8bf13fe37ed2bb183661a0830e2c7097c2c69760a9",
+ "lib/aiohttp/payload_streamer.pyc": "ba4fcd20e3dee68c7dab486e886cae1669258ea193a663a627079056f2727711",
+ "lib/aiohttp/resolver.pyc": "3334292b2743c9450ef8328e76204cd76d997c93b5be108f8c0ddbe56dc8b757",
+ "lib/aiohttp/streams.pyc": "537d33c7386b464407e9ae9373e7a9e072faa209b70209635ae078ec17e1e10d",
+ "lib/aiohttp/tcp_helpers.pyc": "59c850df8cbd8b9d445597b094f9fb0f84712c62f2506466a0df189923e4a739",
+ "lib/aiohttp/tracing.pyc": "e4776b41f1bac0b33d51a5188e1f5573dd865c8d3d501e69f731866373c8fdea",
+ "lib/aiohttp/typedefs.pyc": "17b4dae74a0e93cc8eb29ecfe31594fdcd2ed69af2668cc47c9a6ba40817aa33",
+ "lib/aiohttp/web.pyc": "5482534081492307b7c5546c726658292417cbe37947e463ee48a98c990b4dd4",
+ "lib/aiohttp/web_app.pyc": "84278841ff98d35c3b8c75a05ba8a4ba2d7871f5d6467ef354857ea1b3484d65",
+ "lib/aiohttp/web_exceptions.pyc": "9a05a24667459b5f8dab379ae42f5afa7ba741d3945a6f38118afef688d910e0",
+ "lib/aiohttp/web_fileresponse.pyc": "9ae9d35f70ebbec32aab1314b64056df55d0c5a94bdeb4566645424ab9724471",
+ "lib/aiohttp/web_log.pyc": "aae2b20ae005cc8cfe6aeafede07c140bfd70c91b6d1d053daf41fc92dc8a9e8",
+ "lib/aiohttp/web_middlewares.pyc": "28e58c3b3e953b1fb6fcd9f71044d347778ad2bf26f683f72e63c03f3f2ad958",
+ "lib/aiohttp/web_protocol.pyc": "8462e88e3b1c08d689f5bfc79e3cc18ce9235f60dcabd6b3fe11b4bd0a9d645a",
+ "lib/aiohttp/web_request.pyc": "0e46a92a8da8ee26f8f5c084250e3b2b22522cb97baaf2937db9d9ed834a5fa3",
+ "lib/aiohttp/web_response.pyc": "5e3cdbef1484a2d527d2c077f8b3d95dcfbcbbccaf41883707eb2067aae9c901",
+ "lib/aiohttp/web_routedef.pyc": "8433675ddcbf0242aac47223530bba49745013d41af098df851b9401a943ba64",
+ "lib/aiohttp/web_runner.pyc": "866ab964f310dd93cae9c60a9e6afbb4de8eb2690b7fef901db634db046141c8",
+ "lib/aiohttp/web_server.pyc": "616091ffef3f802b61b1d8167d93e0c298e2f1f41706fb3bba754c22d0d6bc19",
+ "lib/aiohttp/web_urldispatcher.pyc": "42869f67d5d759e54dfbb41379e937afbdc21b65387efc83951291a6ac007930",
+ "lib/aiohttp/web_ws.pyc": "33949ca2fb770499034d37acfb656da7558e7bdb7fa71894913b9d6023a0cc4a",
+ "lib/aiohttp/worker.pyc": "054bb3f42df8270343ba211eb1bc3f16bd536edff88cb4147155d534baec5a0d",
+ "lib/aiohttp_session/__init__.pyc": "b26663cc7a58f32d6862d325ebd3cce89084fff9cc29a116dff60cdf57cd7be6",
+ "lib/aiohttp_session/cookie_storage.pyc": "e9ac1725eefbf45d48f5a8f7b81f9b9731706910ae94bd73693daed44d4a3bba",
+ "lib/aiohttp_session/log.pyc": "e49c940774d98be9e8a2035a63d937e0d83f4c60b35777606d3840ba814bd052",
+ "lib/aiosignal/__init__.pyc": "cddf6c38f8b6b2d4f72bcc307b7e65198d29679cacbc6401c5faffa20e3b33de",
+ "lib/array.cpython-313-x86_64-linux-gnu.so": "46458a5ccd09c408d484e72fa972e3f2e11d541e2f64cca6891d65d8af0c15bd",
+ "lib/asyncio/__init__.pyc": "125b8c3e2c65e2eef97e0f05cd924875f3f078be2f09feb9ebf6a454518ef05b",
+ "lib/asyncio/__main__.pyc": "e527f6dde3083ca2aa412ff65802251b9f2dd2410d61f2ab9ed1ed70f30c2af1",
+ "lib/asyncio/base_events.pyc": "7065500022995b6327137e7a6f634b204d2d5792f65abc7b63b05f3925f20b88",
+ "lib/asyncio/base_futures.pyc": "62719c71ca3be335b8eabca1bed6dbbe13142445c5a2bdcb41df311dd395e818",
+ "lib/asyncio/base_subprocess.pyc": "7e92aa3b6ddd93c5909c61616aa442046718dabf5537a9d0aed540a6ab3bc5f4",
+ "lib/asyncio/base_tasks.pyc": "156573335c587c0b703fd9cef5a195ae43f4e2863aba3a8aa31f1b456795cc2a",
+ "lib/asyncio/constants.pyc": "396d98b48cc0784a8cd1611cde11a1c192f293a3f3b374c772e5b1f7d9119bbf",
+ "lib/asyncio/coroutines.pyc": "7d1eb538d37a0ebbe3672b2e18401d25ef4597849c0bd08587bf0601c4fea62c",
+ "lib/asyncio/events.pyc": "d98d2118ccaa7b6ce775a286ed0cc75f54634e4b4f6f5288af85e4f94b7de73a",
+ "lib/asyncio/exceptions.pyc": "fce4ed55a9d4f3da50044fd3bcb01133e7e9eb2e35e0abcea230122f3d78a9ec",
+ "lib/asyncio/format_helpers.pyc": "4810f90819ec9334edabf5efb565b35d93852b19180a61a9c1a3dc4fdaa79d03",
+ "lib/asyncio/futures.pyc": "1d8a1830d3943e7a055c528f5b57edaf374fde81cba03c773a86382187839df2",
+ "lib/asyncio/locks.pyc": "e4fdce67190062a7e201b8f163a268b86b57a8906f980e687cd4babf740b2b7f",
+ "lib/asyncio/log.pyc": "fa6b0b5855285c49b7b009df334994016eb0fba6fcc4bcaa8dd70ac70352ad87",
+ "lib/asyncio/mixins.pyc": "a0d5c70a9776294bc70b94e5c2d0b4abecd6c28f1c20ae1a0cbef6c94a811213",
+ "lib/asyncio/proactor_events.pyc": "b3475d7b1c14e67becf7b2670a45a3efab7d2141397d70a7cddc49a0862b5549",
+ "lib/asyncio/protocols.pyc": "7eb146102c45d775524755939d56cb704f3860a43722eee294b00684bc03d312",
+ "lib/asyncio/queues.pyc": "a7cd931be3f76357c3f5c34a0ddf72cb35fe6adab49de8c8d70dabb39c2cd3aa",
+ "lib/asyncio/runners.pyc": "a3c328ba320c2009d854eaefc500baf9014c1516bd13ad2ce3f5207000f05201",
+ "lib/asyncio/selector_events.pyc": "0f9b51989f4f93094944a34a6c4b727b03337ef1380d192c24ee7e28bd61eb72",
+ "lib/asyncio/sslproto.pyc": "f0b21e4d30c910c65dce1afd1d3b17430e09e6137a3b8bdbe235d95beda7b3b5",
+ "lib/asyncio/staggered.pyc": "2e047c225e8d78af9268447d5544b67ed8986c0c08b46d880be558212dca574e",
+ "lib/asyncio/streams.pyc": "9c7088833f4b9d7915c8016597620ae96769c37dc20ddb8d3a082f2367e69718",
+ "lib/asyncio/subprocess.pyc": "9c2d0d508afb8de53fa8788055bce84257212fc1c5df11f3645577ae96a0769c",
+ "lib/asyncio/taskgroups.pyc": "4db3d02c8cccc6396c20c479c2d56e463611741e1c576a40bc33e78ae3b97dce",
+ "lib/asyncio/tasks.pyc": "0bb38e3a12777507f48e48aca83ef8034c6756f9b34a6465a1b3297a2f86e1d8",
+ "lib/asyncio/threads.pyc": "071a74d18ad314846a19fd247050dc8fe19bb8bf991b3b11caa634c1ef4c3f55",
+ "lib/asyncio/timeouts.pyc": "8a18b5df07ab9aefdf25c49e2284cb9e3a81e159009fce43525127ec52161eed",
+ "lib/asyncio/transports.pyc": "fe563a1a4b44145eb9103ea9c9eee1be1bea0fa23de5ffcaa5d1a4ff54483ddb",
+ "lib/asyncio/trsock.pyc": "d8ef3a6ac2bbbc2dd71f7adfef472a3de27aa204a3152e53dd67c8d269ded560",
+ "lib/asyncio/unix_events.pyc": "45e4d06a61a3cc1e2fa845b211a615e4de9a1e626dc06a7dab8f1a7b661f674e",
+ "lib/asyncio/windows_events.pyc": "a63d154497c4b50761789c2a0ee27536763f3de5d023aa2fbcb11e490c494b63",
+ "lib/asyncio/windows_utils.pyc": "ea3294bee0e59e24ca1a70c70322110e06eaf1d8bd1e99f946b1a2cc721aa259",
+ "lib/attr/__init__.pyc": "7ce1666b8bf712fd6749f45bf7404f8141b8e9ea208fcf1e3141bc7a9382a47e",
+ "lib/attr/_cmp.pyc": "efc1005e9e6cd484d8dfc01770f26b8d3aca9a369a100849e16e7762c3dbc97f",
+ "lib/attr/_compat.pyc": "578dfaa9f2aa0646ffabfdbf3f53994217780c531398e6d486bf3dcead6347af",
+ "lib/attr/_config.pyc": "54edbbb113eba509a8841ef60a6c9e1fe56ce43e4b7bd3fcf7dcfe84fa99ca27",
+ "lib/attr/_funcs.pyc": "4529d977faec714d625b2fd7dace801934fe333fcaa98ad90de3be5006e0fa29",
+ "lib/attr/_make.pyc": "95e78efc7f09686cfcc2fc72f182ad1a09f2f1fa43e19b6413cf91c8f359b107",
+ "lib/attr/_next_gen.pyc": "7d6e86e14d096f948674d0d0390ee322e2ed6156fccb1b02b0af9b1c18056a62",
+ "lib/attr/_version_info.pyc": "cea4bcb5c36bd0c3c610faa3de26e4407f348e1dfb3636fe9e5f065dfc671013",
+ "lib/attr/converters.pyc": "389d573236e2cb9bf2c57240221bf82d1b9e81a6a0c02bbc614be5f276571cda",
+ "lib/attr/exceptions.pyc": "69b083988eee8f1fb6a7b504748cf2f92e296ceb6001e5da7a8483c10f3485a5",
+ "lib/attr/filters.pyc": "03d9a20422225cac2e268b8debd3a594fe4a1517d331cad19883714a1744be2a",
+ "lib/attr/setters.pyc": "0df8f67da0e1e312c2340bb824e3fd8fe57cfac95000e87bc866ed9f4ca4b00a",
+ "lib/attr/validators.pyc": "6c289bc1a9a10850b0ace12cc27582f995c8b8eea525a1dcf23d245bfe607cd3",
+ "lib/audioop/__init__.pyc": "d779f763f7ee63041b2788e7926e842f9020267b6c7bf1ca01aa8aa3e7a40140",
+ "lib/audioop/_audioop.abi3.so": "e56051a1cdd4146183a186c2d448310593cab692d89d6e9c906b6357bf8ce0db",
+ "lib/autocommand/__init__.pyc": "2305b3fbbe484e5d2fd7fa251fbc047b0cb03eb3a3cf69a7767efdb70fdead33",
+ "lib/autocommand/autoasync.pyc": "d665e11e8febfa39d7d65ccb77bcd16205c4f913a727b60401bccb592f359b3d",
+ "lib/autocommand/autocommand.pyc": "e730f1ea93e94bc8c14787690ba18d0ee8e13515b7bd720098bba6bed847058e",
+ "lib/autocommand/automain.pyc": "bbd61db402acda81b0cbcc88275fec2330a008462e2cd93bedac4cbac64e4807",
+ "lib/autocommand/autoparse.pyc": "073334feb15727bda41bebb97d9e85eb25e123c2f16edd216301863f0f2630f1",
+ "lib/autocommand/errors.pyc": "465052424557c49506411fe6d4845b42889923f8e818e7eec26f50c361f46568",
+ "lib/backports/__init__.pyc": "2c8ae771fcf4d22e8f2febb1c029df963750c95fddd2f9b6250ad6432988fd1b",
+ "lib/backports/tarfile/__init__.pyc": "0cc5521b88ebb4fd688db9dc3ac06078d4db7cb50d909936017ede4586cb658f",
+ "lib/backports/tarfile/compat/__init__.pyc": "44f835fb2cc3172b2f0fe8357b665a4950791d56c1d08ba761716b01a16348f2",
+ "lib/backports/tarfile/compat/py38.pyc": "608bb4065ba901c775844cf8a6e7b15707f64ca387ed907eb8f3365b4fe4d18c",
+ "lib/bcrypt/__init__.pyc": "81ea8d4a8de4d366d376f94ccb7ce98a4e668de8186968f6c867e4a37c2a5b95",
+ "lib/bcrypt/_bcrypt.abi3.so": "30194720850b822529be97190cd001cf43f4577a82fb98054f88d54c726043d3",
+ "lib/bcrypt/libgcc_s.so.1": "137f5385f2fc44139b4c28b230e7e3298da51b04da7fccb0ec2e0a108054da1d",
+ "lib/binascii.cpython-313-x86_64-linux-gnu.so": "9ecc68d05241f9e2aaec02e260beb01e85706f54d464b967bdc710a0503f17dc",
+ "lib/certifi/__init__.pyc": "b1ac80380697fc433b362df66464d96a2a629f1f0b24ad62b87ab45f57d837f2",
+ "lib/certifi/cacert.pem": "a1ad5d643e21c43b5bed74c7e0891dcdb58f6af51c8ace1e4f020d654aa52a16",
+ "lib/certifi/core.pyc": "d4fe08b3a224e86c56dadcb9c85f9d1dc77efbf64a5b102440a30e943123af7d",
+ "lib/cffi/__init__.pyc": "5abc277756964e1447eef50c866ee21eb4b29dae105a9fd68ca0cb835779fda3",
+ "lib/cffi/_cffi_errors.h": "cd05edeee47f9bc8145be7c8da1260d0aa129091705eff111949040d9d7bedd4",
+ "lib/cffi/_cffi_include.h": "131866826f6acc75b35a2be37d37b40fb5e9e2b3d4915c5d36ec0684c4cccdbc",
+ "lib/cffi/_embedding.h": "022df71476e513b5d2a47382a7c90f716c0de7ff41575e0ebcdd0955ae884e9c",
+ "lib/cffi/_imp_emulation.pyc": "e2b233663c9435913d28480092dd5ba48492ea9af483af77c8497a3424a71886",
+ "lib/cffi/_shimmed_dist_utils.pyc": "a67c3b0d3775155896335aafb600e54493c556051e6680b924d43e912cfa2563",
+ "lib/cffi/api.pyc": "31446d40eed56fcbead27e8e5b92a01c0bbd486aa38a6ad2e3dae23d9b203d9c",
+ "lib/cffi/backend_ctypes.pyc": "1a9f4c81859f57cea3e0f4fbc4369d5969462ddc7c3d15ff7968d9b4ee413fd4",
+ "lib/cffi/cffi_opcode.pyc": "10ef47cdbc09d236ffcdf425203f588ab80fbe3fe583d0fc1dfdc17212eb8fe3",
+ "lib/cffi/commontypes.pyc": "ed21d5da9aff90b85d82d1c630e16a16174b4d8e9773605c40304dfe864ffb81",
+ "lib/cffi/cparser.pyc": "e57aa8cea6ff5aa6d994d7dd6102a7942c544c75908941f665df021e6337e598",
+ "lib/cffi/error.pyc": "f1c3ef021fa321fa0254e74626f7e4039bf3e1685574a48d986956306c64104f",
+ "lib/cffi/ffiplatform.pyc": "7a1d393df54633bff314bac71d6f97c3e9ea0a57150b1b2ed354c81c0910438d",
+ "lib/cffi/lock.pyc": "2f3fcfd64ab144fe35379e95a04bc575cf51065f3b2274617183db5c8d7d29c7",
+ "lib/cffi/model.pyc": "eb7c66e6ccd84880dc9a6eba098a55431d0b9daed9c92774ad97060e071057b8",
+ "lib/cffi/parse_c_type.h": "39dc107f033d92dababe5081e377b11509b10c1b63d8c04d74af0b625d79b63c",
+ "lib/cffi/pkgconfig.pyc": "6f03cec917727f9ee5627b64f5d1daae9846eb140a019ab16a7ce58058b3ab6f",
+ "lib/cffi/recompiler.pyc": "3fcf9288fb6cc453c8451fa4561e211f3c3353cf1c68089e56218936b1e27612",
+ "lib/cffi/setuptools_ext.pyc": "0229eee4cba6ee503025674fba2f37187f3818bfdf3004c74aa297456e208d97",
+ "lib/cffi/vengine_cpy.pyc": "76678eabf87f1eba59be19ee7aad915cc46b507d059a1cea0d08b5945d745fc2",
+ "lib/cffi/vengine_gen.pyc": "e1db99c8ce0756c8915de011ebb7cc4c8eea4663bbbaf8f0d044e30db8909396",
+ "lib/cffi/verifier.pyc": "4442789a8313ce1482ed5fa81970ac0bf4252a3cd5f8b373de328cd878ac15c4",
+ "lib/charset_normalizer/__init__.pyc": "2fec82e9da7a2bab346690ed6ffba5936fa87888facfdeb7cec50edc9dea3ca3",
+ "lib/charset_normalizer/api.pyc": "35e813531ca20a31949a2ba539a3e43a82b41c205dde9f1655dbf019989688fb",
+ "lib/charset_normalizer/cd.pyc": "3bcad4082e54951dc1fa60168fcb229ab6e5c8c3fe4be5a0a6de6967a0ec92f5",
+ "lib/charset_normalizer/constant.pyc": "7ea328da464d6708a95dd1b1b7774d4a5956497cb07cbba8e56823451fe460dd",
+ "lib/charset_normalizer/legacy.pyc": "9c82eea52943e10fc95682eb12061ccaf1ed0fa00ae8dd42ac192ae41d7868c4",
+ "lib/charset_normalizer/md.cpython-313-x86_64-linux-gnu.so": "b19eee9ad24b8ca7c0f3734527b9e99220f2af4eb30d3f1c5ad97ab88c7632c3",
+ "lib/charset_normalizer/md__mypyc.cpython-313-x86_64-linux-gnu.so": "8bec9abea3c9b59c234cabcff6104b67c08b643f3cad5b60b9a4a82c7b28fce7",
+ "lib/charset_normalizer/models.pyc": "69c93554423d954fcae8ff89346220e41d23618c9736cb0406b7785124fa07b0",
+ "lib/charset_normalizer/utils.pyc": "566a9f53a90be88c4200fffe2f19efb0de2ad5218a661224c482d9e768041267",
+ "lib/charset_normalizer/version.pyc": "96f72953986624ddcd0710ad91f7f9d7c908c37b8089c6c26c6ec2716683e445",
+ "lib/collections/__init__.pyc": "b9ada7cfc1e2fc545b268636b9df60621622983bb1bcc5b21afff96150543d83",
+ "lib/concurrent/__init__.pyc": "13cc52f582591afd766afa93e361ba6fdc982af60b6f84a7c0a79c3809f46d2a",
+ "lib/concurrent/futures/__init__.pyc": "1d9aa3d8ff459a8bfa737e1a6cd8ccf41b7b9bd1f5fe0624573627f509cded37",
+ "lib/concurrent/futures/_base.pyc": "225a8ba28ee6729fd15a75a02d5fafe8f860ce50f090fa3d03cab6a0a4168b88",
+ "lib/concurrent/futures/process.pyc": "d43394a758af7f82f8f8ab05d894e130c73ab08d35fa63114c235961d08885e5",
+ "lib/concurrent/futures/thread.pyc": "f757e632094dce8fa462af77f1ac7520751069fbf9a39350a141b53adad38c19",
+ "lib/cryptography/__about__.pyc": "5040c4e0ce889c374d78b0c2c0b263161645519dc23640df1558b772e2787c14",
+ "lib/cryptography/__init__.pyc": "e9ed5cc7c13040557d6317572974c18447f302d7e153d75bb2e3101ff78c3e75",
+ "lib/cryptography/exceptions.pyc": "9eecaa79dcf52884c00861a871dcd4efd4d58020c4be3cbe8974fdbabe692979",
+ "lib/cryptography/fernet.pyc": "2bf50cef31c21a1408aad57bcdf36bf26648b9ee5fa0e831bb80838c5afce8cf",
+ "lib/cryptography/hazmat/__init__.pyc": "1ce22605f8096b1738157ae98c95072e30276a292df416c64901bee0e24bfb14",
+ "lib/cryptography/hazmat/_oid.pyc": "314d99135c971dceb5ab709f5fb8cff029a5fd25e2c27259e399196f6f928d38",
+ "lib/cryptography/hazmat/backends/__init__.pyc": "5305d1d8b255cc3f9ca45a0cf2b077a3ae096fb4a9db9c605e6618c9f65d0bda",
+ "lib/cryptography/hazmat/backends/openssl/__init__.pyc": "c8799af22c47c3c8cea859de98b74b814292b0a5280df6550ae8c128cca8a2f8",
+ "lib/cryptography/hazmat/backends/openssl/backend.pyc": "d496ed296de5e79998da96c87e12bd0fffa6a3cb329687d990d513f4e86229a9",
+ "lib/cryptography/hazmat/bindings/__init__.pyc": "81f1c244c8413079346ac84fc8e58cca96a59eee71f040b42b4e94d38108424e",
+ "lib/cryptography/hazmat/bindings/_rust.abi3.so": "4bda55a10c6f7b46d0eb895f7b6e735bedcc984667bb5b88ea27a1be19cbe92c",
+ "lib/cryptography/hazmat/bindings/libgcc_s.so.1": "137f5385f2fc44139b4c28b230e7e3298da51b04da7fccb0ec2e0a108054da1d",
+ "lib/cryptography/hazmat/bindings/openssl/__init__.pyc": "d905654e5fe841b625fb961c043c45d7a327325ad8835aff023888e4d065a05f",
+ "lib/cryptography/hazmat/bindings/openssl/_conditional.pyc": "ad35144725ba5b4e850d775772d31694dcef92371b4dc801d7ed02e121bf5351",
+ "lib/cryptography/hazmat/bindings/openssl/binding.pyc": "d51e7fba0a2a4b90836397e268436b259133f07fcbddd98c6d393bd421a37a81",
+ "lib/cryptography/hazmat/decrepit/__init__.pyc": "97719113f127d835a0864e9209119faf339343ca6692d4c487526ee10087a02e",
+ "lib/cryptography/hazmat/decrepit/ciphers/__init__.pyc": "721f8dbe69240ee0956f5a98688eec72cc6c1baa5e6685aa44292bf90654bcd8",
+ "lib/cryptography/hazmat/decrepit/ciphers/algorithms.pyc": "e03e590b93c85174a25400b9694c386c5ad29a1f0bb9aa405f2b351c191c83e8",
+ "lib/cryptography/hazmat/primitives/__init__.pyc": "4932ba4cda8cc7a1677410801539f0b20e08398cc80c1286a87abce7ae64c399",
+ "lib/cryptography/hazmat/primitives/_asymmetric.pyc": "8b2e7419dbd2256e06dc84327359c748180c6ed515eb3d8b7d8582527ef94dd0",
+ "lib/cryptography/hazmat/primitives/_cipheralgorithm.pyc": "757f8914e678a576675ec253b2140e05514d7bf040be1b050f0e921241736859",
+ "lib/cryptography/hazmat/primitives/_serialization.pyc": "2c8debc550e51a74f6eb9fef5b5ca1334f2f28defeca148fc5a660e8263dfebb",
+ "lib/cryptography/hazmat/primitives/asymmetric/__init__.pyc": "c79933eba1203cc2634445d7db33f2627fc4249b6aba1deaf0e70b913f09e1a9",
+ "lib/cryptography/hazmat/primitives/asymmetric/dh.pyc": "48ab4fee6eceedf5ba6ba998956905b5c8531c154ea44abef5999f8312ab8922",
+ "lib/cryptography/hazmat/primitives/asymmetric/dsa.pyc": "9a734788bb97c3a0ad12af0a4c1f7b820e81290979a6dea95ac8ac184cc7e9bb",
+ "lib/cryptography/hazmat/primitives/asymmetric/ec.pyc": "254b6e12aa8c1f8f0bb1d83078e94218dd97b4d47b79124e6db761829e6ffa3f",
+ "lib/cryptography/hazmat/primitives/asymmetric/ed25519.pyc": "b7e8e3125641797745af916e0411adc3276f2fa32e67ec9bdce844730f63155d",
+ "lib/cryptography/hazmat/primitives/asymmetric/ed448.pyc": "db829a247c7aef0c9c32078ec4ea10028d42c569ef028785777ce02b4348528a",
+ "lib/cryptography/hazmat/primitives/asymmetric/padding.pyc": "905e2bb6aca5a594a16fb16ad90427db185a830998dcbd3a2182e48b7b0ca78b",
+ "lib/cryptography/hazmat/primitives/asymmetric/rsa.pyc": "5d1cb3ad436c512098012a7244118920b7fe9860c77331df5e926840edf99da8",
+ "lib/cryptography/hazmat/primitives/asymmetric/types.pyc": "894f00cb8a8cce769e9d83892d1424449377cf7a2f4f5696958c94ef15071f74",
+ "lib/cryptography/hazmat/primitives/asymmetric/utils.pyc": "f714e6c086e1915afc6b7ef72589c3cd0d7688d2e5612c003c633d19bb43eace",
+ "lib/cryptography/hazmat/primitives/asymmetric/x25519.pyc": "4ded3ed2ef399b4c7e1805c1b20c2cc62542e9f6429b881ea478a586973b5f0b",
+ "lib/cryptography/hazmat/primitives/asymmetric/x448.pyc": "a949b3fc6947c81ea5d508114ad4950851a3a9623492ce9804884b4143274a45",
+ "lib/cryptography/hazmat/primitives/ciphers/__init__.pyc": "b4f47de1ca9f9ee295bd594ba864a026bde9c023a497bab405b3d8147ccbd30e",
+ "lib/cryptography/hazmat/primitives/ciphers/algorithms.pyc": "61fb7c262b923c96c14ce936d9d35a6ff83ebf226ce2bc40e44aee9a5f3e6244",
+ "lib/cryptography/hazmat/primitives/ciphers/base.pyc": "14e6e2c51d3f2c435ddceb38af9c4f144825d8218f19db4116a6774791bee79f",
+ "lib/cryptography/hazmat/primitives/ciphers/modes.pyc": "de599d7e9adae8530c91988b77d1db329b8ffe895f7e3151f8003a815338d096",
+ "lib/cryptography/hazmat/primitives/constant_time.pyc": "54146fd41804d026ab5124faa7c5485e08164d359d417a03af662e408f915445",
+ "lib/cryptography/hazmat/primitives/hashes.pyc": "fb6250fc53045b103a7acbb48004f23dc1ee3589482750a09a5ce01e5e573deb",
+ "lib/cryptography/hazmat/primitives/hmac.pyc": "d80fc301f7faa2a1fd8c7eeddf5bf25ed1ef699a941eb081059fe6b6dcfbd4e5",
+ "lib/cryptography/hazmat/primitives/padding.pyc": "c97cc03c44cbc69f24526bd410787e3c60ead5ea2a8d7cbbd3d4bbc1641aca2f",
+ "lib/cryptography/hazmat/primitives/serialization/__init__.pyc": "737a6e28f8aa4ca03b2c5ba0a935157d8ba1790194ac86925afa249dd80a4436",
+ "lib/cryptography/hazmat/primitives/serialization/base.pyc": "3890b46f074a731961d50c4c35dfd8c09f9771aee61d6c759a0324e2d5a53bb4",
+ "lib/cryptography/hazmat/primitives/serialization/ssh.pyc": "69d2ce0bbc007cc85421164a9b27a73f5a55ba1fb7f22a47dfe99015861aaa7d",
+ "lib/cryptography/utils.pyc": "28ea9a3c4b6c1b1b8a529c51037955b4e30dc5c1a4f1134a02f500f9c149ee18",
+ "lib/cryptography/x509/__init__.pyc": "90eb02466fa409b39e2069e6192566032b98cd1bbf777e439be02a7f560a8ccf",
+ "lib/cryptography/x509/base.pyc": "427289c340355b236553078d1232f91cecdbcc284e6d244b397ddcfb6577c3d3",
+ "lib/cryptography/x509/certificate_transparency.pyc": "90dbbeab2c2190ac54233b6ed8d74280db3b835da40cf014f1387fdbad193177",
+ "lib/cryptography/x509/extensions.pyc": "f00b4b6fc2c135f2789ad447b4eb4050da2392c468a37bb0d1384fc3657f6bb5",
+ "lib/cryptography/x509/general_name.pyc": "c3c0df1b84d8d6e020e37d3e2c091526571056ae6949e97202a662eb5eac72cc",
+ "lib/cryptography/x509/name.pyc": "45b0d0b72ef32a98fbd969b6b466291edc05bbfdd9e6dcd2d22066db47a5790b",
+ "lib/cryptography/x509/oid.pyc": "ffe72841c7b08455a286cb81a89445f284465927eedcb9b71255168943a09157",
+ "lib/cryptography/x509/verification.pyc": "1d4670e54991349be608e0c499b1125f34613d0c00a651342de59938e4766b6b",
+ "lib/ctypes/__init__.pyc": "4302ab703d326e6c078a0fdc30303c50f379befa5e2f9d9a61eb961679a91908",
+ "lib/ctypes/_endian.pyc": "2146ef8f031c98ac65047fd46f80124c9a8b685114089afdb79b26a3668e8193",
+ "lib/ctypes/util.pyc": "4e4dfea2ed896f473d8faec5c122698bb25778c57d8bc9c01c285e7bcce99fac",
+ "lib/ctypes/wintypes.pyc": "46ae4ec3576650005edf89f1bf9502b450857cb556ce277e7437ee83d55f5cd8",
+ "lib/curses/__init__.pyc": "8f054047b59d63bbc1a1327e94cceab7f3c96d534d7d9fcff9847c14a1064cfe",
+ "lib/curses/has_key.pyc": "8b0c6cc7363efd1fea65929a08deeb776eca9d0d890e12c7a8a5fddb7d1f4778",
+ "lib/email/__init__.pyc": "43af03418dc020acca5742113f8a476c640bc4dd60b2f9649c31f4596c41c81a",
+ "lib/email/_encoded_words.pyc": "ffb46570be99ca3e8827cae60395bd3db8a4584d1aa9a547cd7419632e640937",
+ "lib/email/_header_value_parser.pyc": "0a253eac2183713a384d10ed4ecc9411aea9ebddf9ab5b15214381cb5e0ef638",
+ "lib/email/_parseaddr.pyc": "bf8602b54cfcb5388d09aaab47944817b548828122b3ec42a862649750621bce",
+ "lib/email/_policybase.pyc": "116e811fd1b6f718975a83f0d0cfeaca4f8f510b4fd006ca53d71836af2a3399",
+ "lib/email/architecture.rst": "f2b2ba7497fd02d13abcfc2a98099283a94b09e8b4f2c1c822ecacde3bec3eae",
+ "lib/email/base64mime.pyc": "018add364a4a5ff9d2eb21c279b1ed98885b8751a42a513dc09a431fb22c07c5",
+ "lib/email/charset.pyc": "8dc69a6e56e8f3aab02d29eb3eb7af080cdaac0a3b5fb7d5c26f09bad8ed7fcb",
+ "lib/email/contentmanager.pyc": "14110ce70e29c116167cc9cab6704bcb2088966e1d96eae00ec014e9b217e031",
+ "lib/email/encoders.pyc": "1d3db039b1ac9406a3e9ae73890f60caa19afb58461458da2a0db35753be708a",
+ "lib/email/errors.pyc": "20861a987c0aa41bab34ea1731896c04f98137a35c6b3b5fd435fd8c7637c7fb",
+ "lib/email/feedparser.pyc": "5dc5ce7cfa9dee15ab49e4bde936abd81b43983403c5c560dc9342371d523a65",
+ "lib/email/generator.pyc": "be4981f1165ffeaf2807931fdd8765227a9425379cca8c7ca21e1b5deffb39da",
+ "lib/email/header.pyc": "c106830742c646f4c1e16597294b92ff144fe42538312ec5b96df94c94d7bcbf",
+ "lib/email/headerregistry.pyc": "62104032594baa2c8af7d7748f424148cdb0b2dc04d0305f00ac83a28e1652c5",
+ "lib/email/iterators.pyc": "ba748cdf5cabc34fcb7d8bccddf2e57684cdbb08e65087b8f7fb06b6192bd039",
+ "lib/email/message.pyc": "e35de5a6a89314f7774910dc7bc16617bbd82bfcafe162c1ce3ed1e438a01c7e",
+ "lib/email/parser.pyc": "65ade732f3c1f29c37725539d087a191d1de284f3b07fdde876575be4e232362",
+ "lib/email/policy.pyc": "0afdb552d822d0447a0bb3bcdde983fcf6c57a48a280be34ccf136626c09c57a",
+ "lib/email/quoprimime.pyc": "6c5aa66d61ce4fc021a8f97e1b3eb0cd83fc3d1139c62dda7f5aca044dce0e2b",
+ "lib/email/utils.pyc": "cde45e8d88e35c2ce925adc1a048b7381e529e9e62912117cab69db5748c32f6",
+ "lib/encodings/__init__.pyc": "511f4e15d17125e705c6f31d4ead0e25ea9b9fff1ea04ec55b560bd711d26714",
+ "lib/encodings/aliases.pyc": "29b030ea1e4db25738cb2cd23320295a485b9c13bd7f134883691df378613e71",
+ "lib/encodings/ascii.pyc": "85b4aa4163ecef918436a80399fceaf91ad827a8886a41102c267ae6246d3da3",
+ "lib/encodings/base64_codec.pyc": "1126393f4682fb3c570287e296b8fa99a7a924d6a89595cce2cefb06a469b0da",
+ "lib/encodings/big5.pyc": "f4fd0ad7fd8d6d53e32109f8ada85b7d5b025df9e9549ed52d2649d2a54153bc",
+ "lib/encodings/big5hkscs.pyc": "15a3486177d9c0b820e1c20efbc6341a756869b457ef34cdd85da98377a4e3f0",
+ "lib/encodings/bz2_codec.pyc": "02e5e2b96dd76a162d800c69054c446838ef2906d852eb56ce2ec895ce681b99",
+ "lib/encodings/charmap.pyc": "75c8f16db3c39d6f640c2691119fb47d567a2061ffd64cbf7e4b2faaca38f25d",
+ "lib/encodings/cp037.pyc": "e68993c7270cfbd9aaef6d383e967b161666287711086fd45c820fade526ab73",
+ "lib/encodings/cp1006.pyc": "fc5482b8b5a81bb6e4d374628ff737f2115bcf3a181bd8b109983fdb9e61547d",
+ "lib/encodings/cp1026.pyc": "ff1943ca1d24435dbccdaa0f9c1d0fe67d4d497334259079a4100306dc34a174",
+ "lib/encodings/cp1125.pyc": "9b1095bc186b02503e310b677d6bb487964f91dd81292f08dec08a3925555b6f",
+ "lib/encodings/cp1140.pyc": "efde679bbb1efe79f5d7f915a509a50d833cef3aeb089544b208a4feacfac1f2",
+ "lib/encodings/cp1250.pyc": "9df7b179e98b710f6878bf7b9885a261ab17f179b7af2c1416ff59a7a546acb1",
+ "lib/encodings/cp1251.pyc": "4d3ee8019206e06473eb93f07008bc7bb633f37e8dab2584c68ba73fa699224a",
+ "lib/encodings/cp1252.pyc": "aa002ee24a40634790bdea8b0d363a26b6eeed631446a4d5b081e912b6b9d4ba",
+ "lib/encodings/cp1253.pyc": "de3da6dbfc05ce81a617a67dc2f29d3a3b87b4e7589be6ff6f8a09b85d27ae66",
+ "lib/encodings/cp1254.pyc": "f5b9507febec176bd9babba00488cdcf4795d2c7fe23c0c83f8623b531a9aaee",
+ "lib/encodings/cp1255.pyc": "7d7debdd4c11f0364f97ede13c26029e6e042e89ea8238bb3a89576581ce883f",
+ "lib/encodings/cp1256.pyc": "3f00fb2689a17688c8833a98b5a2ee20194fc5951829c10966410f21121a6de1",
+ "lib/encodings/cp1257.pyc": "1d6d3d9dfdacd23c6fde4545c422874abc95c800d8c74f3c3279312129b6b4d5",
+ "lib/encodings/cp1258.pyc": "cc598cde3a73abadca4eca4ffdd7cc303a9d32ea639c6d3f8c4b5fd89a19cdba",
+ "lib/encodings/cp273.pyc": "31b3e72225fce2bfe274ca66042bc5edd61829ea052ba3999c71eb8c22311268",
+ "lib/encodings/cp424.pyc": "9f222f0ec6e2fe1153b1605a043b3085a3d7b9a09032131ab1460e57ed62479b",
+ "lib/encodings/cp437.pyc": "09791d8784d0fefeb2408668b1ce790a08b961e09d77bde97c87aefeb0e78973",
+ "lib/encodings/cp500.pyc": "9133aa286795986d748c9614e4efc226be5cac12df61e5bde88a1597002d5eb2",
+ "lib/encodings/cp720.pyc": "f0a2e693e692067cad947d24dfc9e7545d806ba3f1d5c28c8742c940a8c85c0b",
+ "lib/encodings/cp737.pyc": "2cfdd530aa05b7d2238c2c1f8989c4c88e91ac9b90a49f8c92e2a77907c6b1c9",
+ "lib/encodings/cp775.pyc": "d8fb7e7dc97e95bca3d50d6b00f93e4283a69ba134fd873471f7718225895e56",
+ "lib/encodings/cp850.pyc": "58d28428c423abbdb60b7d6a73d010680813a2ee883a5338ca9b528d8553e0d5",
+ "lib/encodings/cp852.pyc": "ba5df766080eb5437e434cc05ec217be3045ca26ee18a9fd4f8b838f80db0fb5",
+ "lib/encodings/cp855.pyc": "211127d2e9a36d5c7ed328b6338d246f9525280d1db97da0ac3241efa483c6b5",
+ "lib/encodings/cp856.pyc": "c84a287e7e2024dfe30f1395fa0f4fb376ee6683023af1180bc2c8c933c25e26",
+ "lib/encodings/cp857.pyc": "6a180d1e89f3b814cc51a7fad135c68f3cb5df54b3f56ba2e369d4adec030a02",
+ "lib/encodings/cp858.pyc": "acf596858fdb5f55efa44c9c3be6fa944c9cfbf238da452b5c0853449ae53514",
+ "lib/encodings/cp860.pyc": "5fa76ab68ca3dde01ea91f6911a226af50c0f934cd76ddf564236ee9e49e5f71",
+ "lib/encodings/cp861.pyc": "84f99dafaa7ea3d9287ee8705cbf6cd47ac3ebdd449e314c86c1fb0ca363239e",
+ "lib/encodings/cp862.pyc": "a9f63f4f7e7545cbb57bf4b0b5a353f8cb6eaf80bcdd12b8d7e12042a9779274",
+ "lib/encodings/cp863.pyc": "443d0d918723f38b866da367166267909fac7ce2e71c5b9d1f7789a89b2c7222",
+ "lib/encodings/cp864.pyc": "afe841991ee417e457938f3e42d941fc8734814935f7851e383ddc3c017041d4",
+ "lib/encodings/cp865.pyc": "36c01bd0f3af27054ba00b509a5b92f8767df7619c6d6c71bb3a925d875840c3",
+ "lib/encodings/cp866.pyc": "857e65b6a04669b5fd84daec1a63cd0aa5e1c09cf09b8a56ddc9462d873a562d",
+ "lib/encodings/cp869.pyc": "7551ec7b969fce39d01fd0993c8353dd5a894250f6f1fa2ff8d1eefcac8a45c7",
+ "lib/encodings/cp874.pyc": "0d38275d30f26fd61957e8a62927a8dce980d4870dbc23a9cd4a5a843f82d03c",
+ "lib/encodings/cp875.pyc": "38b3fc315d23146880b72be05c0828a09fddbbdd52256f99a357ce277312bf39",
+ "lib/encodings/cp932.pyc": "ad24265b14056c4ee5af96b9f6efdf943859503c8ce2e9547ae1035044412282",
+ "lib/encodings/cp949.pyc": "e30832884957b745fd08acc7ecc54edff0ae6fc37a0a3308c0ad7c6bd834dd81",
+ "lib/encodings/cp950.pyc": "8e14e463ecd6ff14600c3882045f6ca00c29f55ed9f71f4f0b7cd4c0df7ca459",
+ "lib/encodings/euc_jis_2004.pyc": "ffbcd915892904d30e01f6968271feaa4bb3fd5d4027144db30ad8a52f092708",
+ "lib/encodings/euc_jisx0213.pyc": "31fee0530a2d34d749d69e96aa29f553cc7c18f887bf79c34e641553ee6a12d7",
+ "lib/encodings/euc_jp.pyc": "ae09801344a7d699e4051ef3595cef252424d975b93862b5101ff8c76d551bc3",
+ "lib/encodings/euc_kr.pyc": "316ab80a00802503e78a6f38c194b5602e5331db20a52fe3cd023caba025f80b",
+ "lib/encodings/gb18030.pyc": "f212bc4067c068b41acfeb89c391318bbf6bfa859a3e071c10589be9375a35c4",
+ "lib/encodings/gb2312.pyc": "1c1184b6d0aa0c553e8c5ba9716a8d19c6ddd173ef3a2f5bbb4d83068a69152e",
+ "lib/encodings/gbk.pyc": "a507aa6602359065834164d1bc85a1fe7f99c3cf285347eeb678b510782fd82b",
+ "lib/encodings/hex_codec.pyc": "610c7484d6bf645a6efbc64bd7dfdf2efd16eeb9c08562fce9746270a9593939",
+ "lib/encodings/hp_roman8.pyc": "49ea7e73a9c2863e59a0cb3a5fb0bc916fd2ff529796fbd99e995d0ecbc6e6bc",
+ "lib/encodings/hz.pyc": "b838ec5f2057bd42d86b842f9ea20fb38538f8d9bfa731e9c04449b88d9bdb7e",
+ "lib/encodings/idna.pyc": "3448451d693769812dd84261cafdf9049aa2ff5cfc43e1d5e21ebe016fec88a0",
+ "lib/encodings/iso2022_jp.pyc": "1dfbf5351869b86fbca712f032a7669d15d59021ac2aafd0261345749e005dcc",
+ "lib/encodings/iso2022_jp_1.pyc": "edc3836858855dcbd80170d4bf22be16d502c91aefc8d871abaaae79be63328d",
+ "lib/encodings/iso2022_jp_2.pyc": "85ade0baa1a143e1e34c879a06e27cb509b38978c69f8809fed2a09a2d3d9203",
+ "lib/encodings/iso2022_jp_2004.pyc": "982ae84e56bb31bf3cfccdb349c21c91247beb55f15bb24c4bfacf2be25bcba1",
+ "lib/encodings/iso2022_jp_3.pyc": "a8e9fee8d0ca97d9a01ce4423c69d80dec26c0f404693b6b1be748c4801e5d65",
+ "lib/encodings/iso2022_jp_ext.pyc": "e0085098dd278e4881c6c65448267fc38a2207a25ac89dfd641bb92afa29fd62",
+ "lib/encodings/iso2022_kr.pyc": "6c05c59a946809074ed954f56e6d3194806e2f70c215aeaf2397581e751343a7",
+ "lib/encodings/iso8859_1.pyc": "91390871c96ef1d8d21e68d4865710c068d9a778028a743d2cf2d0abb7997823",
+ "lib/encodings/iso8859_10.pyc": "539ce8db5b59c5934e1487c30cfc670bdf7c9dd7ae7f2d6db85c9d4e6bbb578c",
+ "lib/encodings/iso8859_11.pyc": "cca4b4e525620bfb1910ad6308453652c6728e1a81599d5f46cb1b2ababfc876",
+ "lib/encodings/iso8859_13.pyc": "4a5d5206000c9cda3e434be430f5317fb090f141f16b951e5066c30541d6bbb9",
+ "lib/encodings/iso8859_14.pyc": "d8548e78ef97bc8f58c36328b735261a05044d6c37dbdd3a0bc92fe6216d4b63",
+ "lib/encodings/iso8859_15.pyc": "1c752c0413f2aa1d2f574bdef4883dd3cc2bc276fb8d7dfd21b1cf0efbcc709d",
+ "lib/encodings/iso8859_16.pyc": "7e4b4ec79073e56940aded51705b991f4940659e247886e21c8d7ec93bdc1afd",
+ "lib/encodings/iso8859_2.pyc": "470525f101c80d50df300ae5c1887ab6edbdc345ac19c68bdfaebb027ad2c96b",
+ "lib/encodings/iso8859_3.pyc": "9c6c6c85ee8b9e17d2bd9ff69a46fbb1cd83200482d5b2af4fc4b9cc548991d2",
+ "lib/encodings/iso8859_4.pyc": "265feee74e4ff142d6e26d913200e836f6461a4c910c3e3b3bfbfb618d01487b",
+ "lib/encodings/iso8859_5.pyc": "505986fbb8292ecad3ec8380840c95576b96ad6b1ae04100b106dcfb334e7dd6",
+ "lib/encodings/iso8859_6.pyc": "ac8231cc493d1356ba13b6b1b76206a3b696a27381b13a36543ee141be7b23d0",
+ "lib/encodings/iso8859_7.pyc": "ab4c01fba265cfc666f6e5b8d2f2f4da9a63321521250c78d956dd774ff5c37c",
+ "lib/encodings/iso8859_8.pyc": "116670cc032ee02703ee9dc1686038b99f44aa2650c2b59f30c33bcb38215620",
+ "lib/encodings/iso8859_9.pyc": "4cbb27bcc36c2f097755187edfcc2947ee607cb0a661c9429de0340c4e77e8b1",
+ "lib/encodings/johab.pyc": "6c7c26118344c5e6d67173ae44cd42355f69dbab08ee25cee995b12a8e80f66c",
+ "lib/encodings/koi8_r.pyc": "40022e8a11fbce93d9ddd032ad534da1d95be8f5220542db915a182ef8c4969b",
+ "lib/encodings/koi8_t.pyc": "a0667a8eceba104a270c66ad8b15be9801b0b2af5789cc3cc1388fd153ff8999",
+ "lib/encodings/koi8_u.pyc": "cf239c702c6c6c3ef7c721ed254e063cd7ba3d014dfa26306e741f63778dbdd0",
+ "lib/encodings/kz1048.pyc": "60f8fa71ef8c66185aacb3c1afe233c06e26afb4fbe8854f2738b4de2a1079ed",
+ "lib/encodings/latin_1.pyc": "5204ed88c326dced22f7a071e3901de823a60c1c55e2f0c9396beda8fa840e39",
+ "lib/encodings/mac_arabic.pyc": "982cd2e8668956d577c99a021d46a2c790b85db6999fa062ea33f4bd43b88f8e",
+ "lib/encodings/mac_croatian.pyc": "c6f4ab7e0642015a37b5f99753b465e8204ebd245eecbfc99080e21c680c366e",
+ "lib/encodings/mac_cyrillic.pyc": "1f90db7ea725d027ff4e0215528ba72d43608ad8fde0e2315c0d1204592fc4f8",
+ "lib/encodings/mac_farsi.pyc": "be482340c12530526276e5f6c917325f221d4ffa0a7a566837b7c5c231d3a636",
+ "lib/encodings/mac_greek.pyc": "c6c32e02962ceb92aa2732cdbccfa8091a0e8a32180316850b91e2da5ad4524a",
+ "lib/encodings/mac_iceland.pyc": "3016aaebb7990e4a24ddc51c1409c582f88446b745100b1f4d148460e50a2a06",
+ "lib/encodings/mac_latin2.pyc": "260b3b2a74ef0546460e45dfe4898adedb8ab3c9658a2babe3cc57e3fab247f8",
+ "lib/encodings/mac_roman.pyc": "f3ffe35420d0f6b015c352f39f7322113da2926213f42fdafe90831cc9fde8d8",
+ "lib/encodings/mac_romanian.pyc": "49ca89cb92e25abf55f897bba06a53feb98d9cd8c41de730abcd8448dee86e0e",
+ "lib/encodings/mac_turkish.pyc": "953eb68f7709a6e10b7fc0b2ec0cdf02c1e6d9c5a3893ac21adafd7778bf9152",
+ "lib/encodings/mbcs.pyc": "53241f7dcc92158d651a7a88aac5fed0527d85ceaddea992928f4d252c9af157",
+ "lib/encodings/oem.pyc": "87092ad0a2f640506dbec48858bc711b42cb9f623f8d2aaf2e0486c618796803",
+ "lib/encodings/palmos.pyc": "33a0244013cbf2ac9c0d364859654b01e06ea0ea0fd39c992526ed40d514596a",
+ "lib/encodings/ptcp154.pyc": "6bbe231075d0628b10abc8ce8fcbea3ab0f13c131690e3bbb96d256fff17849a",
+ "lib/encodings/punycode.pyc": "57da62ed4b0971c9b3d7aa189e4fc63d040c8627909853701d64815a15f16cc5",
+ "lib/encodings/quopri_codec.pyc": "5d0dd205491ac2e074342f0501d70118778d37fc3c06a4c021ceaf762fdc3079",
+ "lib/encodings/raw_unicode_escape.pyc": "87eae53ca92e90dec6ca73b8028598a56dcf7ed24957c90a4763419ecb977dbe",
+ "lib/encodings/rot_13.pyc": "fe71dda8742eb20a84ee9b5c00ea151269c91e06d068d208ed5bba9c114566b7",
+ "lib/encodings/shift_jis.pyc": "e4fe396a99013a47f4f35fed76bbf1765006dd973c3f0facbde2d03683744fd4",
+ "lib/encodings/shift_jis_2004.pyc": "f9971fb6008b93028563ca63a10e3ac954ca5a7ee3c6ca25bdda428af42cb91b",
+ "lib/encodings/shift_jisx0213.pyc": "21bb5b82c2de82f087567900c7c821a32ec3e8f9e62a52057cbd8afa63aeb9d0",
+ "lib/encodings/tis_620.pyc": "f84bdf1fd1340ef032dc79f897fcad94a40c5da2cdb257a5d0053180298b2f7a",
+ "lib/encodings/undefined.pyc": "591a039b58bdf55c378b911838c5aef1f3f89f545a996a2ff6e0aad11dc7b22c",
+ "lib/encodings/unicode_escape.pyc": "2f0c202a5475cf8c152f3bf7f75a8a4ce83630f2193cba2359a93285df815331",
+ "lib/encodings/utf_16.pyc": "6ed41a335b5ebfa3b671853803d011f54b6351a70af24d8127cbc30272d75aad",
+ "lib/encodings/utf_16_be.pyc": "7c6d1a7745553a727dfe58b87b058b7ab9505892648a466ec6f3cfd779cfc55f",
+ "lib/encodings/utf_16_le.pyc": "bbabd696c5502e9419859dccc6d75c6de58da225c8ac1fe87581e8e039a297ed",
+ "lib/encodings/utf_32.pyc": "7a3d494a3d8a5d17018799c4395f4cf99dbdc4d26398f92501052deea5ada83c",
+ "lib/encodings/utf_32_be.pyc": "b0fa77c493623bb10366853edb8d3c3eaccb8b6b9a2638749f3b3fc6408e6c11",
+ "lib/encodings/utf_32_le.pyc": "bf767e8d4b38416280328ee3dd21f1a5ee3e834efb61034fa2ab41038a895a98",
+ "lib/encodings/utf_7.pyc": "e8798005731bbe3630fa511393644c4b3d9685ae26a0bec287ee6dd5e176e70a",
+ "lib/encodings/utf_8.pyc": "c63d47f0711ef28a1d29f8a4af32080c754aa3fb5caf3dbc21ce036ea6275ed3",
+ "lib/encodings/utf_8_sig.pyc": "f4d277baebe36240c4c724d5541ead493e81c21f25d89b2de4cd6d509b8cf7b1",
+ "lib/encodings/uu_codec.pyc": "236f4c508610a5e2e48fba802530b7fb6d16e79dc6762f02222bed6b02c1c768",
+ "lib/encodings/zlib_codec.pyc": "d01a005a4c98e069e6525934b888f5feb087f9a18b88d87ac38bce52cc45bb17",
+ "lib/fcntl.cpython-313-x86_64-linux-gnu.so": "2734d1e09ab16d63287b03ddc0647697e77eb3ee795c36f6938cea3f8e8545bf",
+ "lib/frozenlist/__init__.pyc": "3e3dfdcdea844606e7f9be3dd69f3e77a837c8d239ce642deb0db5507ede54ff",
+ "lib/frozenlist/_frozenlist.cpython-313-x86_64-linux-gnu.so": "4fb57635221abb8360185ca93de3ba7b8f78d93c0cb070722adad243958838ba",
+ "lib/frozenlist/libgcc_s.so.1": "137f5385f2fc44139b4c28b230e7e3298da51b04da7fccb0ec2e0a108054da1d",
+ "lib/frozenlist/libstdc++.so.6.0.34": "f3eb617c6c2b6f14db1e113aee0406afd0c3e47d753eb0e854adc8bf9a4d86d6",
+ "lib/grp.cpython-313-x86_64-linux-gnu.so": "097825f73cc224df50d4efd33fd0e0055ce95087ff7fb84cec4f0efdc3487b61",
+ "lib/html/__init__.pyc": "d2fb865f9170cc81d4a16320a6712d9b81b1e6be72ecc70752f41c43b84e0bd9",
+ "lib/html/entities.pyc": "a26f249e0019017df7652bb1543181692bdc8715c4733115fb7491bad7cc52d8",
+ "lib/http/__init__.pyc": "4e7d012aa620ca6d0c6f98dbe05be12d395a4914ec0b11cf36da01fd66aa0323",
+ "lib/http/client.pyc": "51979abe9a7d5d55310294c34e0c3a21db281667dc0d2df2dadb5959398a2cc7",
+ "lib/http/cookiejar.pyc": "3cb2c5c8fd7d04e8fcdf06ddd35a6624efca9cf7228e7dcb8638b32cbd655e4a",
+ "lib/http/cookies.pyc": "6ebad245818800b00cb1180fc08df622beba24acf949d3cb719fc7210fb3b498",
+ "lib/http/server.pyc": "989364c9265dfce753642f685c1ff5ba6dc67ff525ef751206ef0280b812b51b",
+ "lib/idna/__init__.pyc": "8ffc5650b4971d8854e307329eb80957d175cf4b595b8961aa5962e868942681",
+ "lib/idna/core.pyc": "7f0836740146c1bf71d857c58685fb89909568239dc7c083df630cb16eb56143",
+ "lib/idna/idnadata.pyc": "1cae10d46a8251014d4c20acbcc6cc372447c8730e3e2fd13153909412dacd05",
+ "lib/idna/intranges.pyc": "2aad7d44123e089a7f73d68fe9297cc5d9b75dc9639d7f71cb16589454f764b9",
+ "lib/idna/package_data.pyc": "b9d1ce4255c69eb103bb9793db6a7a14964b71a51c2e2e645d9041c80b89007f",
+ "lib/idna/uts46data.pyc": "e8672055afdb0c9b37fe6c4469d7df378670be3a335fc5ca6225760bea54a000",
+ "lib/importlib/__init__.pyc": "22a9ae9badf96d7d14b2dfc3df437f70b499d13a2703ec41abd03eda4f847470",
+ "lib/importlib/_abc.pyc": "7df0b948bbdbc9ccd1010fb9a0c84694b0cd659b367cbe574d1df391ee3f26e8",
+ "lib/importlib/abc.pyc": "ab50b07964cc74fb954982c5719a9f6ca1e9780f40ca27ea76075ba706878488",
+ "lib/importlib/machinery.pyc": "ba4e01d789969c50a8133347d507ad46c11f08428d74673317f8dc493e59b4fe",
+ "lib/importlib/metadata/__init__.pyc": "c86018501b28b7ca5a031498fd16c106db007d25897abf2c453e5ae5012ffed6",
+ "lib/importlib/metadata/_adapters.pyc": "3d6461cf1653be69cb13268f8dd7884c3e011a39389a5bdbee18876c7e2af90e",
+ "lib/importlib/metadata/_collections.pyc": "f67ac41169e990ef6008a81a2ef19b825aef56ff9314e3a63cec4bbbfd1cd2f5",
+ "lib/importlib/metadata/_functools.pyc": "192dd2e83bd7f45801f5853af67ef3681324a918a7dfec836b186a1b5bb2eaac",
+ "lib/importlib/metadata/_itertools.pyc": "b4a5e844889fa8ef3ec1e9275aab5ed5418c560eb264be20dbe54cf402757b07",
+ "lib/importlib/metadata/_meta.pyc": "89e3ea11a3541356d9fef9bfd86320b91904dfec92b2a244170ab1f0c83574f6",
+ "lib/importlib/metadata/_text.pyc": "c916acca4b8a05859a1c8aea3e55c77a66a229e8099cca8db64e1a2c6be1036c",
+ "lib/importlib/readers.pyc": "984866bd579d9d5fff19ff44643dc33638f907f3103b73a89684e1493c285391",
+ "lib/importlib/resources/__init__.pyc": "579c03c7eef91dbe93f488189871178ba2dfcc6315e8cd7a036fe6d419552946",
+ "lib/importlib/resources/_adapters.pyc": "a55a2e0b0349a542c670655447f8b7db43a2517aac60f8f1cec70981017a7306",
+ "lib/importlib/resources/_common.pyc": "20bb1d45febcee2092e1939d27a44ea32505a748744b7ae8b1f6b9be0213da42",
+ "lib/importlib/resources/_functional.pyc": "2615910591110b905c188df898e7991fb56355b223a640046c84cf002bc52f62",
+ "lib/importlib/resources/_itertools.pyc": "a2a5900409afe5ea7891924f26b01a174c53720cb5766227adb2b175a7737793",
+ "lib/importlib/resources/abc.pyc": "57c071934625f48a3bdf52940400648d7361fab99656347b0c4458b52ff0fe28",
+ "lib/importlib/resources/readers.pyc": "a4bf9f48c60f2a75c9c6eb811ca3e71c4b27815f894dd4149531c6b30bd22093",
+ "lib/importlib/util.pyc": "77d27dc69a6a0f20bdfc53594b222e3c2dabfa2b9707a7f133147fb57369a846",
+ "lib/importlib_metadata/__init__.pyc": "55ed566f7e4d69d475d2e5cc4c6e63dda554bc62ba0ba3454e24e8ed3663ff2b",
+ "lib/importlib_metadata/_adapters.pyc": "3cc0717c0b0d9eeba2321266f57074f1ed1d801225588ce833d83b7014d5f2e6",
+ "lib/importlib_metadata/_collections.pyc": "483aa25420a23e13b8c75045ca16b2f466fa906c37d436c5b04a05819e8e182b",
+ "lib/importlib_metadata/_compat.pyc": "c507162cf523605c8612bbf29267ac9713a3159d51488f6f2a10c9f9c88e925b",
+ "lib/importlib_metadata/_functools.pyc": "663579692d59c12d18240daff74000fb7c0283570a2352d8b41c0d893a2a465b",
+ "lib/importlib_metadata/_itertools.pyc": "53ce762ae7bbcf6100058b0ed22ea70f4a25e4b3514d1d1bbb39fa49cbe6e465",
+ "lib/importlib_metadata/_meta.pyc": "f2dc4d4b7ba003a7f4e126579a8853cc6a56ed2e17574ba9f9779c6cb74da62a",
+ "lib/importlib_metadata/_text.pyc": "f85d16673dd0128336a80c8561ea663e112bd432599004c8b9cfd7e677422e3d",
+ "lib/importlib_metadata/compat/__init__.pyc": "1021b3d48bda3ff9862d0c511356d0c303211fd8e89f0727851773e16a218fc1",
+ "lib/importlib_metadata/compat/py311.pyc": "7e013b094add40ac00b26fda1cfdbc4457fc8bb1829e62cd48b30879f1843a96",
+ "lib/importlib_metadata/compat/py39.pyc": "f4067e346dd73ae1a7adaafc06b0e86e6464f01d3820c2056bd95cd0256e3e39",
+ "lib/iniconfig/__init__.pyc": "fb06b735587f75c4c115910f67742343eb30425835828d1d7ac97fd0e8b24656",
+ "lib/iniconfig/_parse.pyc": "c1e57f05c6714471acd53d5cf65473e398accae7d18b5a2780f3561d06e7d269",
+ "lib/iniconfig/exceptions.pyc": "882cc0427f3845f42bb1b654217bc5f7a8a6570d124ce4d73fd032a932ed67bd",
+ "lib/jaraco/context.pyc": "f63fd48a0b09f1ad5fe59ac334f2af23e39ed71679b011eaec1e1ba4cf8bd0c5",
+ "lib/jaraco/functools/__init__.pyc": "d539b6213ba2830fa2c84259dcbc343cad909ff602814232ca88bb417b748609",
+ "lib/jaraco/text/Lorem ipsum.txt": "37fedcffbf73c4eb9f058f47677cb33203a436ff9390e4d38a8e01c9dad28e0b",
+ "lib/jaraco/text/__init__.pyc": "4f39e775e39d102f4d30a703974525838e1f7ef7c1ae0b1611005684bb97c10b",
+ "lib/json/__init__.pyc": "a743e4ca070006a1351e9f41ed42f4a9c7008f81d11004fb4a65d884eb302c90",
+ "lib/json/decoder.pyc": "d91ebc5eaf62ea3c6adafb6bb88524ebbe60bd90ebba5caf0482080bc42f4091",
+ "lib/json/encoder.pyc": "30b9ee965500cd9acee983284c56c0ab3f807ed459d4b05b14c1782b7bb14e28",
+ "lib/json/scanner.pyc": "8b007a541a3a1d2b98224ac75e0a021b946f5f1c7c0b8458ee4969e0b893c6b6",
+ "lib/libbz2-a273e504.so.1.0.6": "2acee2df9bb0831e1a3d96a5512401c327f1797190f4119d3489f055fd34c9bf",
+ "lib/libcrypto-85e6b9d2.so.3": "7826eb7cb6635decd07716e94c9b68c21c78b66ad201dfbf555ac8ffeafdb9e6",
+ "lib/libffi-af4ed708.so.6.0.1": "c096a87d15318afc47510938992571be481e29ea82d49895a87322fc1f412f3d",
+ "lib/liblzma-004595ca.so.5.2.2": "f105629aa48d03620791da98c781e77ac5843723f681fdae5e870e85feed7ad7",
+ "lib/libmpdec-eba35878.so.4.0.1": "3fcd8b2298f1127812f9974580820afa18bbe2dbffe9a70d4e735708f298c6cf",
+ "lib/libncursesw-7e1cf128.so.5.9": "ade5fc012a8ba5ca5706a45d75fd1d2d8c03c53094cfd02c9969ce79c099bce7",
+ "lib/library.dat": "1794a90e19985ee2dee89f9bdffac8dcb3676e2555db9469384493d14708aed5",
+ "lib/library.zip": "503b1a45a3fddb2cd91004b63aedd61adb8a6f66b5b6782e6012748781abb570",
+ "lib/libreadline-2c5f7b8d.so.6.2": "d18e6ae0f60020c59da3cdfc99072139621796979ddb856177336c0524bd2752",
+ "lib/librt.so.1": "f9d5adc794ed3c8e471322dc00594bec7cdb41a91826fea5f84cdffdf32a0108",
+ "lib/libsqlite3-01ca9f0b.so.3.51.1": "3037f4feb728a56fdff8471db43646511162890ac9a574b514d7855731509558",
+ "lib/libssl-8c54fafc.so.3": "30888eb384c5db0a61021bc6c370e70dd88ef182d18b4a9d5c63ce3b84b7c837",
+ "lib/libtinfo-10270e32.so.5.9": "e1676f7e9545ecbec991e229ea11fc4f6a245a4d828be90422d6e3923ee738a5",
+ "lib/libuuid-f64cda11.so.1.3.0": "652d0d569e4ffdf7d2f8091d0b06ddf4498d5aaa3c7e5abe40c30678ee25a1f4",
+ "lib/logging/__init__.pyc": "423fad5e1b21361a37131788a398729fb519bed5823bdf3c4c2330c3570c232c",
+ "lib/math.cpython-313-x86_64-linux-gnu.so": "9254d145161812011d0edb28a61c72d3b906c472ce14d4e17b984f98ff159c37",
+ "lib/meshchatx/__init__.pyc": "55a439f62810e53fe62d7fcecaff9991a5ce0cf551f6181d6786115cfc36c796",
+ "lib/meshchatx/public/assets/AboutPage-0IhYgVnf.js": "be97f886fd21bb730da22f3d86dd395c7bba9ee607b59320a399dbb82a089d81",
+ "lib/meshchatx/public/assets/AboutPage-8fEiI5uK.js": "ea611e6c05060ab6113a5257fe1567289edcac8fcf7b8296f31b43a62deb4a39",
+ "lib/meshchatx/public/assets/AboutPage-BKLttI6i.js": "b875d7ee84f7f21916109e655ecdbc9a2aea276e9dcdd293ea4df5ac984f6a98",
+ "lib/meshchatx/public/assets/AboutPage-BMjlT6TK.js": "a819b1bd3cd16a9e724526f1b70e1e3b9122dd9e06593907d0205a4efe117cdd",
+ "lib/meshchatx/public/assets/AboutPage-Baol2fuy.js": "68e8abd9d0a1f76f8ddd0b33f2cbb4ff3b9ab7091ef561565c5d73967a50db00",
+ "lib/meshchatx/public/assets/AboutPage-BcCaFooV.js": "d963caa627219ce5688dc4d713711033e2660e5aaa48540295db17d24a5984c7",
+ "lib/meshchatx/public/assets/AboutPage-Bn9rvwVK.js": "a6b193ef20eac72b320ceca8ebcd4bef596dddb493e96be21763f1d58bcbebbe",
+ "lib/meshchatx/public/assets/AboutPage-BzBwKHSG.js": "f87555d7df8436a3ceb96229c75a9e577854c7ae83370d9e0b6b492d76831285",
+ "lib/meshchatx/public/assets/AboutPage-C9JNCYeR.js": "e89333d84a9e990e25c89dcd4cb14604087d6c3f06b162e79a69a1658d7a31d2",
+ "lib/meshchatx/public/assets/AboutPage-CHatkEki.js": "b790af35e013a477024c26cbcd8579ebcb319aefce9a1ec7fa695edeafe9e897",
+ "lib/meshchatx/public/assets/AboutPage-D4r8SBwq.js": "38fd9844b860a9f32e72e89027313cc136e139d451bdee39fd971efaf77adef9",
+ "lib/meshchatx/public/assets/AboutPage-D8YSes0g.js": "a705ef6cb7bbadcdcca2bc95fc41eb131448d1f639ef1ada24ccf4ab4a876784",
+ "lib/meshchatx/public/assets/AboutPage-DAC1QiAp.js": "20cd57b43a7b3f84ff35e3c3b050d52eb5cbe17f222622176e8458c8c6aeb96a",
+ "lib/meshchatx/public/assets/AboutPage-DCeZPdz1.js": "d488356ed2d2c4cf6bad1dc1a76fac40ddd5cf8ae9f15c700a2d86266be2990c",
+ "lib/meshchatx/public/assets/AboutPage-DDJYGtfQ.js": "6824866eb30a454bf1ae261e399af0794334749f3fe9a4b57a4aba202d27764c",
+ "lib/meshchatx/public/assets/AboutPage-DrUL2TvN.js": "a085bdafd2fcc7f374a8a44df7210b485fd887e373f77f7c992c6b32ffd980c1",
+ "lib/meshchatx/public/assets/AboutPage-N2UDxc2H.js": "7d112575b42b15e099768502474e9351dc6c6187c7746c93baa407941eb16ab6",
+ "lib/meshchatx/public/assets/AboutPage-cO7wDO0p.js": "52a488610c8761150402c5fc97a3fae6fe8ae0226a9e3fdeea48349948e1902e",
+ "lib/meshchatx/public/assets/AboutPage-jCiPes_8.js": "290f1087991d8b33569e8bf9b3e94646c0c3ed0925186086dc19b5b00b1be40c",
+ "lib/meshchatx/public/assets/AboutPage-mT6yCyKK.js": "560e6a3f5ac5837a50005ee2bf022bfbe081bea4edf5a2bbdb858cdc4c2913a1",
+ "lib/meshchatx/public/assets/AddInterfacePage-8U5lyEuC.js": "a54d4e83b86185c420ff1ce8318ad3d5d1e0e7f770ea76a1136e4ccf63440690",
+ "lib/meshchatx/public/assets/AddInterfacePage-BCtbSofF.js": "58f202f4dc213f5fa1e24d04c3a43896ffac4a6a4ba84252a1ce3678a7c23e03",
+ "lib/meshchatx/public/assets/AddInterfacePage-BMaqdHgt.js": "405f581dddb488a46a1a38edfac866ad4fe74341d7a257176c65c2fd380cf0c6",
+ "lib/meshchatx/public/assets/AddInterfacePage-BTcYysxX.css": "61dc0b5468c223aaff8acc47626e4284e72e07262b5a0a19d36707888f7208eb",
+ "lib/meshchatx/public/assets/AddInterfacePage-BUgU4mHN.js": "0e93cbfc04d75845850fe092ad62a3728070dc94f41239d8031a357dfeab23f6",
+ "lib/meshchatx/public/assets/AddInterfacePage-BZsc0GRV.js": "719d721bb9d8ede61d49eb952ba97921924a64c5f78cf287b8b6bf6cdb72387c",
+ "lib/meshchatx/public/assets/AddInterfacePage-BdMCP1YI.js": "204a083e1dc0cc14eb6c6a4576c623d64c79b0a873a0fffecddb5eeb794118e4",
+ "lib/meshchatx/public/assets/AddInterfacePage-Be5myeHR.js": "4d018cd57da9cec137655ca974763ecb13e3291ab4c58b8abc68663f09a0aadf",
+ "lib/meshchatx/public/assets/AddInterfacePage-BmsAxVL1.js": "7fe441daea357e273d99cf203bb3a04639765e94905d78346f3a74784873c3fb",
+ "lib/meshchatx/public/assets/AddInterfacePage-BqSlOb8S.js": "ff15f4d2720903de44609e10ee2161b315d2285d1b4420f02318620f2a3ca248",
+ "lib/meshchatx/public/assets/AddInterfacePage-BzRcwDV6.js": "c8b85385f076fd7137a02c0104059492de64500281e54c809af820dc4c24de04",
+ "lib/meshchatx/public/assets/AddInterfacePage-CHsX34aM.js": "c0c86def1cf79086fcf251f5bd56ec72e8a3943cd96fc94f1417bcf67a1ba6bc",
+ "lib/meshchatx/public/assets/AddInterfacePage-CK7nWyjv.js": "42f25fcc18cb40dd0546b65c5f167aacbf40348b9511a43ca98bac1d6e307ff6",
+ "lib/meshchatx/public/assets/AddInterfacePage-CYk70Bnr.js": "6e71d5bbd13d27dd77b08ecebef797d946d5b5336923acca7f62e6d050eddffa",
+ "lib/meshchatx/public/assets/AddInterfacePage-Cp0aXqUn.js": "ded3735137237672936d6726ae6d75a091ad2a96e625192db1129ee657a1d9c8",
+ "lib/meshchatx/public/assets/AddInterfacePage-Crr-YNaw.js": "2cd4c836089ea6aae5eed770e32616cf953a38ea6385e817cde4796d81aba9b7",
+ "lib/meshchatx/public/assets/AddInterfacePage-DVuvwyDC.js": "4037e6751c12ff9db02915ad9f782fdb7729efec3a16a3fad6e313dd578e8145",
+ "lib/meshchatx/public/assets/AddInterfacePage-DiEX5AfZ.css": "03ec87be159836fd2f2bc256a1cf6c19a206e6f0b6b17e3ae4f7ec6891687a08",
+ "lib/meshchatx/public/assets/AddInterfacePage-Dk6b4P9D.js": "6940d4c0d65b20b9b4d5c937fdddee735c5c4c3df657a45f6ef62517c65309b0",
+ "lib/meshchatx/public/assets/AddInterfacePage-Y5-VKBIk.js": "bf511802432a98c3bb2408bf9edfb6d75c1532a6ee26a7e6f38fb04ab02beaa1",
+ "lib/meshchatx/public/assets/AddInterfacePage-udEolizH.js": "ce6eb44eea6d61b67562e9d69092634d7383dea1c4bef0a211f7dad7ae223462",
+ "lib/meshchatx/public/assets/AddInterfacePage-zIW8kofQ.js": "a97fa4b221e628d246be8420d0c2508690fdc1c80d9140949c1b17a72a603f06",
+ "lib/meshchatx/public/assets/ArchivesPage-3ZoRbsmi.js": "fde1c3442c645107042a8689e613225a9432926ccdbe03bdb75450fd50e6efed",
+ "lib/meshchatx/public/assets/ArchivesPage-7LB1KeTH.js": "a22c8b1aa71747240dae715b155f4a1b47fe6c303fa57b9d57b5b4359c4f6532",
+ "lib/meshchatx/public/assets/ArchivesPage-AaES3-lS.js": "f8bf7a93042bdf6b6532106886afd1455ed14fe0246589441e2b22af89f4b13b",
+ "lib/meshchatx/public/assets/ArchivesPage-B15552h0.js": "443edf93cd2f63ea6c3223ac2ba6379321a06b32b9a25a2966523df5fd85c8ec",
+ "lib/meshchatx/public/assets/ArchivesPage-B8bIEMTn.js": "2c4f39ff0cdebfd0f306aa40bd660be0f2a401137cac8d9188d462974b047edd",
+ "lib/meshchatx/public/assets/ArchivesPage-BLofx5Zi.js": "e9eea40e43079084781a8df397c652b52b7049252b282e779cfb629b34abdae1",
+ "lib/meshchatx/public/assets/ArchivesPage-BeHVXSmu.js": "7fdbccaa7c8d9cd2ba710824d278978268a0fd5d31ad43bd84f27a0ad8b9e725",
+ "lib/meshchatx/public/assets/ArchivesPage-BoD5FNM0.js": "74ffd82412d7f1411283ce2a328d69f3afa1de6cf8327ccfbfbdb7d248c4b328",
+ "lib/meshchatx/public/assets/ArchivesPage-C1yHbXva.js": "485a6363fd0229c6778b45a96121145006eadc3a4c1f531ce1264406a8161759",
+ "lib/meshchatx/public/assets/ArchivesPage-CJFohVhF.js": "d6bf0fda552c71fdd9912ac5394401301ce71900bfacce94df8bbf2df3b0efb6",
+ "lib/meshchatx/public/assets/ArchivesPage-CPxaPYQo.css": "f8cf0bf5a3d3c7c61b339e4246174b90e8edd0f01fdc87f5fd76e99c32b1bd5b",
+ "lib/meshchatx/public/assets/ArchivesPage-CjWmGi3s.js": "9f9f6c9f1476e44525aabdc1cf6d2e1c6b2ee841fb85cd5a55e767abcc0930b0",
+ "lib/meshchatx/public/assets/ArchivesPage-CreAUQ-V.js": "cd57436865376503b20a3263b1b014fc39ae59102910aca718f1979f57a5067f",
+ "lib/meshchatx/public/assets/ArchivesPage-DCznv-zV.js": "d1a2a730f22790ef535db226771f70735cdcf14ca21104ed762e98153eb01641",
+ "lib/meshchatx/public/assets/ArchivesPage-DQNKVWWo.js": "8be434387e152fb31cbbb5b32c0cc4b7ccb8c63784f80cc7163a11e45c8240fb",
+ "lib/meshchatx/public/assets/ArchivesPage-DfAEykmy.js": "df01fe9cc5b6013e2a84907fb923edb87e2a22bd821b65638d1527ccc84bfc30",
+ "lib/meshchatx/public/assets/ArchivesPage-Di-dIsoJ.js": "bdc86a5ca40adfcf7fd09da7f88450c0c77e65209b9ee0b9133511149af5cfb7",
+ "lib/meshchatx/public/assets/ArchivesPage-Doi98rCD.js": "f91519241562cd872d3784d793a283864a131b8f85a3c598e58750abab64d400",
+ "lib/meshchatx/public/assets/ArchivesPage-DqLN89ND.js": "70217190b4b707c524563a537bb08ee6a5976e80296f59185639fea3a55a05c5",
+ "lib/meshchatx/public/assets/ArchivesPage-MQE8c1mh.js": "14d23fadb15611de351a698a2ba4629aae6db1f254398a351812b07dc2b1218c",
+ "lib/meshchatx/public/assets/ArchivesPage-SegXm3vv.js": "aac23f598e672781342506f453e9d573f7924162b8f9f219f3664aae564279c0",
+ "lib/meshchatx/public/assets/AuthPage-B8fvh-c3.js": "ef3b4603f62ae490b274b10b69784d2cb305cabaeb25494d5832e5801b45295f",
+ "lib/meshchatx/public/assets/AuthPage-BQii6kbQ.js": "5e46fe0dd5d098071ed41146c0ccc60a209a62039fd481ee1915c5395e1c53ef",
+ "lib/meshchatx/public/assets/AuthPage-BScK_nq2.js": "a227df74dd7e182188fd8d5b0a66b6e915695ae7dae21726a87e6fd3d7e3a563",
+ "lib/meshchatx/public/assets/AuthPage-BWX5PNrJ.js": "f5e9e870e3c059a7203def71892fcd4603d3236e2945e3d4fb75bcc8a2be585e",
+ "lib/meshchatx/public/assets/AuthPage-BagJfDyo.js": "bfb4fbd35bbe9dc6b50d9b8f1ba93109df451750ca3f662618580a3516ab4528",
+ "lib/meshchatx/public/assets/AuthPage-Bfh9quB9.js": "da133fbe8bb18280d2c53d14853d6bae92786b91237297967ec2fd4507c46845",
+ "lib/meshchatx/public/assets/AuthPage-BytNkU35.js": "1c1c7fb89f0ef26f26bfab5e20275e838d3e16bfdf6394840785d94ddbbff160",
+ "lib/meshchatx/public/assets/AuthPage-CFC1s3eA.js": "a2c0f1f63836817e708a94b54ed4c66620a46684cc53e0c7b69d8de5856642bb",
+ "lib/meshchatx/public/assets/AuthPage-CIDofeln.js": "c6087eb9c56f4350fa098ad1e1d978045244c08382f3483b12880c03768bc36c",
+ "lib/meshchatx/public/assets/AuthPage-CbO-FPqt.js": "40b5a6050fde24bae4afd6597e33ec1d01a46577613956e3798cc2ba9b969177",
+ "lib/meshchatx/public/assets/AuthPage-Cl_ZNA9t.js": "de9b317c4abb001603c5434af2f19b7167c2feacc826cf828a0c1bb5f3833929",
+ "lib/meshchatx/public/assets/AuthPage-CnLp5Bef.js": "ab3beb2fbe4a68f9a8e790655cd3a164f25c814f4146632e7a47ec90ee933f0e",
+ "lib/meshchatx/public/assets/AuthPage-CsBUr8cw.js": "70f63f63b6ec11c27baae6b832f371e85ca2ce6394b29271eab9d717f6da4ac6",
+ "lib/meshchatx/public/assets/AuthPage-Cuw13OWi.js": "c9ff77da541874cb4700f1723136ee746f49506162671cbc2cee4b9f97fc9c5c",
+ "lib/meshchatx/public/assets/AuthPage-DE_R8ybi.js": "65b917ee43a2b8e24d78266a688fa6bb7e9709997f7dc1a5a351ad18f6981c95",
+ "lib/meshchatx/public/assets/AuthPage-DPOdVS_2.js": "313265c078c81380fd4f5c59611c8afac6aab58e86c95016a55fdee8533d42f5",
+ "lib/meshchatx/public/assets/AuthPage-G6XYwO3I.js": "e690d7c33cac1460e97230c971009cc32082e5be7929c992a271d8b87af4c641",
+ "lib/meshchatx/public/assets/AuthPage-XSiZwR92.js": "a3641bde2eaa53c066c108c4f5a186497631edbd4b75b32b8449e46ee718573d",
+ "lib/meshchatx/public/assets/AuthPage-d0SgjC6f.js": "913b4001bcff6aa1a0c09493294be92101d1a2fa43b3aa55fe2fb13da87c4d4d",
+ "lib/meshchatx/public/assets/AuthPage-mqiDR_K5.js": "516d1705303c381461be758da87a3e9ef065809bed5d2588d4841d8df8a88f68",
+ "lib/meshchatx/public/assets/BlockedPage--w5BAQVc.js": "afe83111a422725f289dfc6e2ceb04e37e6e30ca2cb5bfd94a062b5ab7a1725b",
+ "lib/meshchatx/public/assets/BlockedPage-BKlUYsLN.js": "9acc91d041d1592316cf7620ae9fbeab79cc5e16970cb162c9345a1052570118",
+ "lib/meshchatx/public/assets/BlockedPage-BOvzaN_C.js": "7d6b544b81c5113c166616d4fb3dea5f02036b3443989d947553fd03af44f4fc",
+ "lib/meshchatx/public/assets/BlockedPage-BQwf8_om.js": "b2c148b9f9142f82d56033258fcac4af4fb761d3cc61587016c37d3b4480678c",
+ "lib/meshchatx/public/assets/BlockedPage-BSMLtAQF.js": "8cde5e3b110c9b2d5123d7939fb7ba9b8bf1679e853ed27ec8aad4ab0e5e1089",
+ "lib/meshchatx/public/assets/BlockedPage-Bb8MI4BS.js": "bd992e2c9e7a5346b00bca857800a023b8f2c9d159f3aac8e8d22bf108d93b63",
+ "lib/meshchatx/public/assets/BlockedPage-BbR4aTPm.js": "3cfa7a06970b0f7a143436239720cb04bea09e16393a453cd59019d7c845f2fd",
+ "lib/meshchatx/public/assets/BlockedPage-BcyInvbm.js": "6dfe1f392487ded7f2455dc75497b5e588c1e8867b667990c2cc038a4a3a5b21",
+ "lib/meshchatx/public/assets/BlockedPage-Bl6NIBrb.js": "b8b36625b41a0156a4819c9abf392734d4030768dd3c7c89b7f72c93421db8c0",
+ "lib/meshchatx/public/assets/BlockedPage-Bogen_i_.js": "9d7ebb2b710eaf14e769b444433748692759c8662d22aecb498e8fa5289d28ed",
+ "lib/meshchatx/public/assets/BlockedPage-Bve9i13H.js": "4ae68ec7f8f4b7c2a17a086c4d68ea247cc9fa55b5fc12a07660162b4c0b388b",
+ "lib/meshchatx/public/assets/BlockedPage-C70Xjfnm.js": "d12008d486e83ea90dd21583c3b9af0f323af2faa04831838ec4403925786c91",
+ "lib/meshchatx/public/assets/BlockedPage-CPTT-CSB.js": "cad34fe06f109b33e4ae7b1cc796fbd7a2411d93f689f5521945e4bf70d99546",
+ "lib/meshchatx/public/assets/BlockedPage-CUTBR0Kx.js": "39cf9f0af4bc86db7fa3d5bbe3d2c97d901b3e034031278d4f0bb48d18d6c024",
+ "lib/meshchatx/public/assets/BlockedPage-CUv4mTjv.js": "551d31be0d5b5306335be88df76ed1dd8d013ed980b48fd4dd07702cc8903346",
+ "lib/meshchatx/public/assets/BlockedPage-ChJxX-YD.js": "fbf75b23bf09b612f8f9bd0a80d03e7ae1ed88095963635d6d24bcdfe94c8859",
+ "lib/meshchatx/public/assets/BlockedPage-Cj5wW2JY.js": "aa8223bf9f1909465b89b22f76749a991c39bb783ec27b423bef12b0a6b2cf64",
+ "lib/meshchatx/public/assets/BlockedPage-UO9kbItm.js": "51cd72d47cf9782036188b0ca22ea85fbdb63759a0adbc3a7f46bbb881a35270",
+ "lib/meshchatx/public/assets/BlockedPage-fglMXFtz.js": "edfbefbc2caa6fde26004a5eda5cc41ad27ac1e3b63e9d52bd365301934601b3",
+ "lib/meshchatx/public/assets/BlockedPage-nnfC_qop.js": "0afd8a8d1ac138accc46df7e0e3cf480fbc4f0b84cdf712aa14d3bedc9f17fbe",
+ "lib/meshchatx/public/assets/CallPage-B9A5VbTO.js": "d4a90455473540966994d4404557eeecd37318ebefc4787b31f12e244fca3cf8",
+ "lib/meshchatx/public/assets/CallPage-BRIKPbmi.js": "fe836a0cce17b7370e7deb03cb8bcaa4272bb81251981eb4047263951b0c8388",
+ "lib/meshchatx/public/assets/CallPage-BqqYln35.js": "b9b149e7a963374a939b2b6e5e66c75eca77906eba091441599e7be0e573de61",
+ "lib/meshchatx/public/assets/CallPage-BwAxhKKp.js": "756ebc63cb1e87d716d8d46d47380bbc1e1f10de8a6a8c469190b91af4ad11f8",
+ "lib/meshchatx/public/assets/CallPage-Bwf3B1oK.js": "930180e1a993f6252e56a9d74ffe99553fc652341944ef2e549638a987f5beed",
+ "lib/meshchatx/public/assets/CallPage-ByNY39ve.js": "5f4f0fb49fe376afcfd491661f7d9959c382a3e9c453901ebd2797f1804ed740",
+ "lib/meshchatx/public/assets/CallPage-C5kSsHhI.js": "73c6790c08a44d3cb9131b4990420483fcacafad90d1c58c04e92837d7ab046f",
+ "lib/meshchatx/public/assets/CallPage-CkKTpT7n.js": "bead262cc1028fac6fc7660d854a3db3f383cabe202e9667c94580e71ba53ff7",
+ "lib/meshchatx/public/assets/CallPage-D4jb_f8Y.js": "2ff9e913d7e05765eed2db1beba525cc17f17eb6cba0ec4bd92bd3e167b76e55",
+ "lib/meshchatx/public/assets/CallPage-DAGAK42u.js": "4e0045609ef9b149388d2987d51fc58b22ed12a3382cbb228abeb0d532680862",
+ "lib/meshchatx/public/assets/CallPage-DD0NVwu4.js": "750449435b386e063260c66e8f601de78270cb333d0f5c476c077117da21e02a",
+ "lib/meshchatx/public/assets/CallPage-Da055DPT.js": "a4c3f0c7185ecd3a88cb40f41ed9bd46c1fce904d920a252e7e8046827f32f75",
+ "lib/meshchatx/public/assets/CallPage-DcfOes9s.js": "b45be33fea18b0ccef9003690e1411896ec9a9e9913d92d2ad2be17d777bbd33",
+ "lib/meshchatx/public/assets/CallPage-De8paHKH.css": "8f3c50ad7162d9ca7f0738bf4714eaca03b36f1f609ba158b7d8d7344e6f7ad5",
+ "lib/meshchatx/public/assets/CallPage-DfOmVy8A.js": "7eff0286f3df1c2d74284ba9241bb5919d69947a7775cd717725fde5804cbefc",
+ "lib/meshchatx/public/assets/CallPage-K4yaGC9s.js": "c996db74e2c08d8f08beffd464565eff597d96d1ae75a74250a5bc28bd08984d",
+ "lib/meshchatx/public/assets/CallPage-dxJwwjb1.js": "02c8551f07a3c93cfbf5f7af1d682dbff5247876bf8ea1b322a8560c89947b10",
+ "lib/meshchatx/public/assets/CallPage-iNLpjZ37.js": "2ecdf1321a3382783e66df5dd61e4fffb210c7a2c9d8c34be236f279d53a2f32",
+ "lib/meshchatx/public/assets/CallPage-k4WQa0my.js": "453bb574d9473f8238a5dd0b8505dc98843cc24f0ab6aafa09b6ee7521938acd",
+ "lib/meshchatx/public/assets/CallPage-pUEXQpMp.js": "8de02a002921ae84bbd595b4ecab0df71649b5fe21bf359f71348921b263026d",
+ "lib/meshchatx/public/assets/CallPage-yAxsVFe7.js": "83cf69b23964fa3dbf4a0cffb0caf7af66e4a289d2d586763f3ec296082c45e1",
+ "lib/meshchatx/public/assets/DebugLogsPage-4zJ9O4eQ.js": "9d4653a52e93befc50cc6edcb19c08920411e4f8364a3854cd697be6bccdc063",
+ "lib/meshchatx/public/assets/DebugLogsPage-5UW3nsMS.js": "a6e0960ee21d89409dbbf0e9b990d1984269bb9fb9468873645d3e1391b2bd49",
+ "lib/meshchatx/public/assets/DebugLogsPage-B3SOBo9X.js": "a3d20f64b34b7a217a1cfc0f525547d31e5c78072233fb782d44bc1590e1f60f",
+ "lib/meshchatx/public/assets/DebugLogsPage-BNl6PdKw.js": "095ded4961531b67392ef7127f5cfa91459a5221464f2fe2e8c80eea5f9e6795",
+ "lib/meshchatx/public/assets/DebugLogsPage-Bn8RD8Zg.js": "5a3e958cfcffd6ded7a45c719827cc400fa9a018d666ef96fc9fe4ceffc57265",
+ "lib/meshchatx/public/assets/DebugLogsPage-BxPvNzLG.js": "16d67d2d2a4d825360c077d7529565958506923b539436bc756398304bba8bd8",
+ "lib/meshchatx/public/assets/DebugLogsPage-C0L8VN9V.css": "7e293009b33eae8b7b2ebdbc0b37b7a6c7e10d980f9399145ddbbc171bdbe6f5",
+ "lib/meshchatx/public/assets/DebugLogsPage-C6xFRLE0.js": "e9d2213c42749b082dc182c1e190314f5ba52f6bd88ee051f9bae285ffcedd95",
+ "lib/meshchatx/public/assets/DebugLogsPage-CDvs1-mH.css": "c974af1f0bccc095e14ee2d34861daf60fc8b5af95acf50c18687c48ad132a23",
+ "lib/meshchatx/public/assets/DebugLogsPage-CP3MkkCv.js": "c762f17081abf972b557e111546f666033d304cf0e67374d95e08e0e05d17206",
+ "lib/meshchatx/public/assets/DebugLogsPage-CZJEcwRM.js": "1aa967b389ad8efe5d529ad13a2b4613526f185c358a43412070e7a1349f91c4",
+ "lib/meshchatx/public/assets/DebugLogsPage-CcJfflzG.js": "3f650e18c92aff0ad7ec979d4b4d2f2ab335944176b00eedaf22c74af1b27264",
+ "lib/meshchatx/public/assets/DebugLogsPage-Ce4ZfS-b.js": "019f27cd38c96ca22f4a4c2b8831cf6d6b5fe4d66caefd00f11e60cd22400068",
+ "lib/meshchatx/public/assets/DebugLogsPage-CevruSTZ.js": "3bd5f85166055f20c93cc52ff2127701309f4c6339f22fe2b9e62449fa25af1b",
+ "lib/meshchatx/public/assets/DebugLogsPage-Cs9qaJhW.js": "d246ade48fce67dfcd40621f4fe907415486d801480a0c4e52f4e74a5a96397e",
+ "lib/meshchatx/public/assets/DebugLogsPage-Cy8As8Ax.js": "998ae00f250b91067b7060bdfc380580e4799114b53ac391aabdd60a4ea91143",
+ "lib/meshchatx/public/assets/DebugLogsPage-D3P9cvkP.js": "1a0c5af94a21032a9d48865ab471131b32fbdc3a66a316e85e6dbaa730792141",
+ "lib/meshchatx/public/assets/DebugLogsPage-D74Sftux.js": "97ecc1b085a5284fa375a039457c3b4c0e5c55aa0c425b2aab06156d280b5df6",
+ "lib/meshchatx/public/assets/DebugLogsPage-DehBhZqo.js": "80e0cadc8d7d66a1a896cc9fe1b69b1b0627be083393b2d32c4678645f61eb42",
+ "lib/meshchatx/public/assets/DebugLogsPage-Dn0-LMnJ.js": "b68d5ea0b6fd21006400f3850137bd8de9f740faa39407b64d837029cc9ce86a",
+ "lib/meshchatx/public/assets/DebugLogsPage-Dzy3VE6l.js": "3a8dfc210519a32fc18817a28a03bc765429a063a2ca689b8ac9273d4c7b5265",
+ "lib/meshchatx/public/assets/DebugLogsPage-gQY3fUF0.js": "147125c86aa4fcdbe729a86f66787099c5f0c5ec9b6ff407f280f1f841efd1f7",
+ "lib/meshchatx/public/assets/DocsPage-2_adKWz5.js": "e5b89209f8d2a62c89e263469111f0a2d0d196b6879d96d4d6ace990d1a08e07",
+ "lib/meshchatx/public/assets/DocsPage-B-m7mgh5.js": "f8b24884d2240fea52c8c8213195745aeb25b2ca8b77a773de4e47532f567dd3",
+ "lib/meshchatx/public/assets/DocsPage-BEg7eanQ.js": "36ff4f8aaa910e62c8b5e0c1369952cc4376eb8dfee455eab2fb2da90ad34803",
+ "lib/meshchatx/public/assets/DocsPage-BKOCiRrr.js": "f2f93c9dcb1d75d91d9bbc6c91f50f44a8daf0407b4a449fc1d7a9f54c4beeff",
+ "lib/meshchatx/public/assets/DocsPage-BS52EMoo.js": "49d15c52092ee5bb639e04ea3a043955a5ae65fa51abe02e1f26fa8e05958ce6",
+ "lib/meshchatx/public/assets/DocsPage-BTY2zrzo.js": "efac452791ae3f908f1a01ae071bd47380038b86f63ce67b2ded287ae5c81f10",
+ "lib/meshchatx/public/assets/DocsPage-BXX9iq1d.js": "9a6a297a95504b6b32fe96b6f09ff3b756ff4ae3e5f73a8a393f96caa270a515",
+ "lib/meshchatx/public/assets/DocsPage-BstDjHTu.js": "389e9c0144ddcf099fead7044caf9d75a178b6eb7058701f3d7e61ac59460101",
+ "lib/meshchatx/public/assets/DocsPage-CNRrTRn2.js": "bd18fab4cd464a806c56dce2e1bfd4d42892a5f6e89d4cef9bf09bbec9f5b570",
+ "lib/meshchatx/public/assets/DocsPage-COB1YgpN.js": "d3efa697d7e41103982dfdf907bbe71185f5d3737a51c3deedb227e34f34393e",
+ "lib/meshchatx/public/assets/DocsPage-CYi8pzEM.js": "907e925475080cf1e4d92740d00281c3581d5afb149822c17dddc00950b37e79",
+ "lib/meshchatx/public/assets/DocsPage-C_rhvfLw.css": "8fbae748c54f0d0898d860634da36f5b8556351db68d72cc1a6824b2b5fa8d87",
+ "lib/meshchatx/public/assets/DocsPage-D4LG5S_A.js": "88874fe49a120f0fe8a302268f22871a7d13ae3d4af568d05d59c3c6bbd962df",
+ "lib/meshchatx/public/assets/DocsPage-D9i9itaR.js": "8696f8038aa7e16f50ea7260e5954c47af7b8b204dbebb821e4487608d3753bd",
+ "lib/meshchatx/public/assets/DocsPage-DKNLCnf3.js": "a144235811aee1e8e77c7b6edff3660233f96308edc87b4be8bc68e39c5a2266",
+ "lib/meshchatx/public/assets/DocsPage-DZnaYyVW.js": "63daacfe84767a03c02ae3b21955b0ea0c5b2b4df39017f532f07bc23aede3e0",
+ "lib/meshchatx/public/assets/DocsPage-DcP31Aw9.js": "9a37b54e11a8fcb5562133a3e4dee291cea99e846e45ae7c93dcf5d7e428129f",
+ "lib/meshchatx/public/assets/DocsPage-DfBdX1MN.js": "6d8816b65a3ea61eed13a19f4ae976fe59355b5b79db89d499385fc03c3c1847",
+ "lib/meshchatx/public/assets/DocsPage-Dq-wqU-E.js": "1262db491a0ddd6a242267d58856707d1de4c475b1353b9371b17aa32685b562",
+ "lib/meshchatx/public/assets/DocsPage-DrRohStP.js": "2312be0223d4949903f600dd264928c304896bb141d93e6592070b9153be7f87",
+ "lib/meshchatx/public/assets/DocsPage-DxRL1MsW.css": "2727fa188637b6cb7e9a5f854bb64f00052ed63731865bf349b323048e20d948",
+ "lib/meshchatx/public/assets/DocsPage-ddW0eLHn.js": "7d0a9a47baf19596d8fe6d0b7212afb76cff464031a63cba6f9ee209b40d2e49",
+ "lib/meshchatx/public/assets/DocsPage-hDlg1Y9s.css": "49d69be6aa44d8d062396fad2278d54c9d1da81d18d5a5b9d5c64d8329a3f04b",
+ "lib/meshchatx/public/assets/DocsPage-yrWtkKMx.css": "a0c64c62a6e8cf347bf8720ef650cec044115cc70782a64c4e0755409c48e050",
+ "lib/meshchatx/public/assets/DropDownMenu-BRb-5XM2.js": "0fdb2c12b97d1405c07be38da940815b2302f951418c1cd501a86a69f36e79e1",
+ "lib/meshchatx/public/assets/DropDownMenu-BSIRDIhA.js": "280ab9ee2aa11071e4835ce1b7064c3dd25649aef321b11f25cdcb42f8835a32",
+ "lib/meshchatx/public/assets/DropDownMenu-BTUTU14_.js": "dab91982ba3e31220cf86dba63202015c4fa6c91cafd28cd3764f1a2130d0374",
+ "lib/meshchatx/public/assets/DropDownMenu-BV2CC1ni.js": "00dd4f073a965582f227b43cd04c836791323d1e958922457d32698e5a711b73",
+ "lib/meshchatx/public/assets/DropDownMenu-BXmJSeiu.js": "9e22d613436eedb7c468b6386597c162928fb1cb3a0fcb04d6fd0fdac3a47377",
+ "lib/meshchatx/public/assets/DropDownMenu-BwNpCqI2.js": "3b4a947ba178592addd831612cf2566c4f8fb270ea7f23970ecf49050c2639b8",
+ "lib/meshchatx/public/assets/DropDownMenu-C3oTXFDX.js": "45bfdae74e0a7208bdfc1cbb8a0ef5b476fd38fa87c26034e8ce3f7425bc269c",
+ "lib/meshchatx/public/assets/DropDownMenu-C4IqVjVV.js": "5825129c0341007a531725f77f8d9c9f9ee0adc2e1be1dd817fafe6e03961c33",
+ "lib/meshchatx/public/assets/DropDownMenu-C9ic1-Kp.js": "c9e1b41300d8bd68e2362331821ca1681203f30a098faf76b16ec9b78eeaf332",
+ "lib/meshchatx/public/assets/DropDownMenu-CCJZnVsh.js": "e5f950f69e9153793b9aaaac57ff0c37ea2f3b4ca29754237e4d7030059325bc",
+ "lib/meshchatx/public/assets/DropDownMenu-COST-XEn.js": "474565edab04754aeaf1f2af6cd5d4e4aa8aba47f5aa624209d76b42b00f2081",
+ "lib/meshchatx/public/assets/DropDownMenu-Czu8e35G.js": "d458923a01f011a92bd04b5b7d8e3a6711b23821fb0ff30491d80a9497d2a466",
+ "lib/meshchatx/public/assets/DropDownMenu-DE52OS4K.js": "2d777670085486fa390e57c19ef9f818f8cc4f68766d95992201972142484fd0",
+ "lib/meshchatx/public/assets/DropDownMenu-DTkGrpcz.js": "c902ba83ac75299c8fae12753b8cafd1ab08943d3d51238db7beebe7463a26c0",
+ "lib/meshchatx/public/assets/DropDownMenu-DiaJpxda.js": "013d798b58e1ba50da4355ef1a70799005cd72e75a3a3b42440ff9fb59fc9e90",
+ "lib/meshchatx/public/assets/DropDownMenu-Dt4WcFld.js": "c84fb19e2f12e38aba20d8dff358cc5bf0f4b962dd0e25e3ffeff9fd31329b66",
+ "lib/meshchatx/public/assets/DropDownMenu-Dtgo4qDk.js": "77e94d3864978537c1dae82c8f92cd11f778bdda1f0ba9c0f7d45fb4c0ea53d7",
+ "lib/meshchatx/public/assets/DropDownMenu-Muyb_dgX.js": "a24c874efd47d0e5d6aa87ee98f0249f7b1bcc1ef714c3af8410062c4bde056f",
+ "lib/meshchatx/public/assets/DropDownMenu-OitbrUhj.js": "0aee8c48585c6e8a63cf1c74b6f938288e0bf103c0bee051d2f710d66ea9f261",
+ "lib/meshchatx/public/assets/DropDownMenu-ePZ8FLXc.js": "87cf5654c0d3a008b929a51b78fbe17c1870c3dac140b0ed753080ba8dfd7642",
+ "lib/meshchatx/public/assets/ForwarderPage-ASnZ1fk9.js": "7f236bfc466b3f1d7c7c708a71bb9e63a9f4df478f6c8f3ba8a4a5fb7b0978bb",
+ "lib/meshchatx/public/assets/ForwarderPage-B8iqJoSA.js": "ff127d7a026595be6f57034f2326749430eecf56a27b9c314b7f55a652742430",
+ "lib/meshchatx/public/assets/ForwarderPage-BMLJ8L8K.js": "74c1ee101d3458860179c6bea6764d658c6b865e99c8c3f980444fe507e95768",
+ "lib/meshchatx/public/assets/ForwarderPage-BRot3TI7.js": "9544d8f26f4479e386f429680d953494cc754cf13f3b71dc797f42cb8082aaf4",
+ "lib/meshchatx/public/assets/ForwarderPage-BYX9iOuW.js": "53f8838207db7e588cc6b8e8fbdd2acdf9474d8ea89af9703d78c0474b22351c",
+ "lib/meshchatx/public/assets/ForwarderPage-Bh0rnH3g.js": "76f3f0accff62acdbb77e4c8c5a1d26746d0b3e5efb8568a4a79868d1ee5e0e6",
+ "lib/meshchatx/public/assets/ForwarderPage-BsOm3cTt.js": "330665ee3b4e3c2fd5a52e55fb66ff655faaf94ac462638d877e834e9005c429",
+ "lib/meshchatx/public/assets/ForwarderPage-Bt0FsK9I.js": "a1c0e218aef1f0cf3743aeaf70c78d46e9ad0061d3947d62c2b1800842bc5922",
+ "lib/meshchatx/public/assets/ForwarderPage-CBP8CERR.js": "7ae9ec04800f07619bb1e929f09bc2e46d80bd4274073380213077a7055fcd2f",
+ "lib/meshchatx/public/assets/ForwarderPage-CHhMqC1Z.js": "ed8ce04c20195e56b4250e31fac01bd42190bc6262701f2700dbcc0b8b1afe1b",
+ "lib/meshchatx/public/assets/ForwarderPage-CQq9bhew.js": "b6bb0a2be97e33b41823464e42086dd33337a9b5a85b57d234e6d9f667f11170",
+ "lib/meshchatx/public/assets/ForwarderPage-CbhYpLxX.js": "adc51db70a275fe19deaee1aabc4bac2df85d5677915cec0d554bea5fc8cd759",
+ "lib/meshchatx/public/assets/ForwarderPage-CguUvBJJ.js": "a3aa0d7f2995ebfb0ee52537cff5b782ca032b8c9eb396327ecfb68ee111dd0c",
+ "lib/meshchatx/public/assets/ForwarderPage-CnvdX6oJ.js": "b96d61b7742e46407d42a2ba9e5f26442855bdc76f2b72414dc98c5d33d8adcf",
+ "lib/meshchatx/public/assets/ForwarderPage-CozsIxph.js": "1059df94b80eaee93b4b6da6ac381864feda3ebc4df685b08c2f1b7f1bd8f8a1",
+ "lib/meshchatx/public/assets/ForwarderPage-CvBwYLAT.js": "72180d2d5dcd43842eda609a9a10f476fbf3590e338f354a224324cfecd0a42c",
+ "lib/meshchatx/public/assets/ForwarderPage-D143y7qD.css": "c58183223cd2e32a62ab89be2dae42b891a01fc94832abcf87df2dbff8374b5a",
+ "lib/meshchatx/public/assets/ForwarderPage-DF74u1Mk.js": "7ef45302504af0d69e4606e8deeb76f17c4fcbc22234511102e2c5f9c46ef0c5",
+ "lib/meshchatx/public/assets/ForwarderPage-DShkAayA.js": "75753c0e310f07963b34d2dba65c80f44327e87dbbe880dd4ad58d9604bca561",
+ "lib/meshchatx/public/assets/ForwarderPage-Y7chGBck.js": "0c5efa10fc520c03ec748f80e59a10f8c8a6c8542f9032e8d495e1f3d627dab1",
+ "lib/meshchatx/public/assets/ForwarderPage-Z0455sJm.js": "abcd71db6571b1eb9b33c8d3c0795a562f0a960c5e1a4a9ed92f3d151706cf83",
+ "lib/meshchatx/public/assets/IdentitiesPage-2u5Olo1e.js": "dc8bb5d634d244eb401170bbcf5ca96d9aca886d542998fa0f7c6949a73a8b49",
+ "lib/meshchatx/public/assets/IdentitiesPage-3202l5tg.js": "6fd6e09cbae3288e2d421deaf960fb6bfa807685612297b5e49a886df85d5d04",
+ "lib/meshchatx/public/assets/IdentitiesPage-6a2u0dbv.css": "955a6ccae0fbefc482b24ada826c8a3f3005980a358ac9ecfaa461d078d50da5",
+ "lib/meshchatx/public/assets/IdentitiesPage-B6Ryy6cT.js": "eb46b7f3b6519dc9f6d47dfd5caf2c0432d3f71c1f204b02efe3f099160decd4",
+ "lib/meshchatx/public/assets/IdentitiesPage-B7rMKJwT.js": "a3321e4ada43934ea9c0a49e1f5769e34f88459debc782bc3cd51d7593beb114",
+ "lib/meshchatx/public/assets/IdentitiesPage-BBn2a3pF.js": "9869c8c075800e1a49f7a23b5c25d6cd5f89d3fa9892dbb3480db355b857dd45",
+ "lib/meshchatx/public/assets/IdentitiesPage-BD4TvGn4.js": "6b35f365d95b39e27cc7656dc7a073a9ce190d5a6e4cee843dee745a2845a860",
+ "lib/meshchatx/public/assets/IdentitiesPage-BT8t-ScD.js": "538e27d9b02a2bad13b56f926bb72c6500e8c6f56f6778948c70cc872049905a",
+ "lib/meshchatx/public/assets/IdentitiesPage-BYvn1GRy.js": "5d7cfbf16828a8be6509135f0261e719e43f09f366c6dd2877d37dcc149d6a4f",
+ "lib/meshchatx/public/assets/IdentitiesPage-BmUB8ygV.js": "f7198ab68c28ff6e7761632a2b0e547b919eba4790973aeceb78c46ab142140d",
+ "lib/meshchatx/public/assets/IdentitiesPage-ByIi0vE0.js": "8a12361618c8a15ed6647ff1bf92f5d9c8ca535fdf0bd47b22386e41eb6d4c61",
+ "lib/meshchatx/public/assets/IdentitiesPage-C1Sqy8sn.js": "1c98bd91885c79c991a68aa49700659c2c5083d2687b2795abd52fa7ea825b94",
+ "lib/meshchatx/public/assets/IdentitiesPage-CFFXsLLv.js": "7c53af04f56e8422e9c169f05602ff43ad8565da025a7be41c1684470883fc0c",
+ "lib/meshchatx/public/assets/IdentitiesPage-CGgBXv9v.js": "6dcbf64447789963e7e83e880162d52f417a2b3afd0a35efcb84c0e76037b85f",
+ "lib/meshchatx/public/assets/IdentitiesPage-CqU8xv8N.js": "13bdf898258cadf1b237dcaeef4b342ccb8b32d4d5ff6f655d3e0e3c8624029c",
+ "lib/meshchatx/public/assets/IdentitiesPage-CsDlV8Ey.js": "9ce634bdb2108792f1c2f1adeb06ecf80fb52f9c3c023d2bb83435abd75b871b",
+ "lib/meshchatx/public/assets/IdentitiesPage-Cz-Lldsg.js": "20b1e9061348169b31dcc7a2dda28495946b57c291f9af1ae8c171a433a4d0e7",
+ "lib/meshchatx/public/assets/IdentitiesPage-D2x-Np_g.js": "000fd4d14140f5e939a971eb85b2adc3cb33747fa85fa27490c002cb6cf3b75f",
+ "lib/meshchatx/public/assets/IdentitiesPage-Da7yzPOK.js": "77c314f43a647fdc64ebc84bc0572832023d3ead55c26135d8e73967cc1cec14",
+ "lib/meshchatx/public/assets/IdentitiesPage-DcQ25KvW.js": "9c73fb8c7906e36ce19da94be0658dfc4b6205d90e358ed1f85bde3c957ef8d6",
+ "lib/meshchatx/public/assets/IdentitiesPage-DgA739OZ.css": "64ff5fa2623696104b41f9d70010c4700307fc77d8851f0fd6a38e13df926f22",
+ "lib/meshchatx/public/assets/IdentitiesPage-atAVP6Od.js": "242bf7c16efb2d6e38c4ef24791a7de2ce1e362bf51129503fb843747508e264",
+ "lib/meshchatx/public/assets/InterfacesPage-4MWHd8dj.js": "14b9ad609180af4211beecc2dd6bdc03aa769c30ae0a8777481918fc02b4d100",
+ "lib/meshchatx/public/assets/InterfacesPage-B300_rSy.js": "0e6f6c305d1f3643361307304701a4a3162af9af3f8d9971e3321d6c54a3cf75",
+ "lib/meshchatx/public/assets/InterfacesPage-BAUi3br-.js": "ab9d664fdd1c9c0671074d8db6c3efd68e8fccf7885e84d75cf76df33a2655d2",
+ "lib/meshchatx/public/assets/InterfacesPage-BE69gBFL.js": "f54210b1b611f17cdcf1ad3530b6bfa05df9751518755b32e7cc0a8b86c02f48",
+ "lib/meshchatx/public/assets/InterfacesPage-BGTCDXHz.js": "0a2330c449c6abacdb5292d0b60d1248b020b81945d67178754b545d396e6ff3",
+ "lib/meshchatx/public/assets/InterfacesPage-BPjlbmnf.js": "11a0f91d1a7bf462cabf22ebed6201f908d00e95f03db799f4aa4b969a558f04",
+ "lib/meshchatx/public/assets/InterfacesPage-BW-HN4Ty.css": "c1bb16c277c10876ee2e1b3c170aee4129d69078ef64fa8a1cdc256213f79eb5",
+ "lib/meshchatx/public/assets/InterfacesPage-BYPjrZcT.js": "e3080bd373af904971e3f00c7d7263c186a0a57516cbb8f0a222d4213e378a35",
+ "lib/meshchatx/public/assets/InterfacesPage-BjDKDL9X.js": "1b3eae8280e260cdcfc9fc5b3fe9da188f9094efecb0bcc958d772174d497afa",
+ "lib/meshchatx/public/assets/InterfacesPage-CA8G16Gi.js": "c6af69449342a56592151ec3e768c829763989f2753dc5a3fabf3c5ba3f70862",
+ "lib/meshchatx/public/assets/InterfacesPage-CDwvRlY5.js": "0ad1d3f4550df6c0e8476e78f9461102b11d7d3f33069a2bcc13e48438cf02bc",
+ "lib/meshchatx/public/assets/InterfacesPage-CJb8W80l.js": "48c9ca5acba4399b805a3d9ce94d8c8f9b3b18b45e87b850a0ccd7a7d79ba0bf",
+ "lib/meshchatx/public/assets/InterfacesPage-CKI4gY94.js": "e8ee4a65e71c7607b5dff78f3220253ec83697519ed1b1147fcadf88573a0566",
+ "lib/meshchatx/public/assets/InterfacesPage-CYmlWTfK.js": "c22b12853a76517e5b1c5ae4eb45115283ad4b1d7373a1b28ec166a5d1a46db3",
+ "lib/meshchatx/public/assets/InterfacesPage-DdK02uqg.js": "b3435163b32495ce97529aa8551137f478c4b026bd40069c127d9c0ea6b8bbdc",
+ "lib/meshchatx/public/assets/InterfacesPage-DjKGl6a9.js": "bc94f216c405ddcc0b15cc9d76068d4e8f9224ddfc42bec581ac747c77e6ca22",
+ "lib/meshchatx/public/assets/InterfacesPage-DlDyC-7K.js": "06ba8d692481ebd666841757d09817434f732aa85c6177924be0d523b8961cec",
+ "lib/meshchatx/public/assets/InterfacesPage-DylPN8vf.js": "d65ea3603bc16a3a52ab34225f80d4610b22f9a27e2c6be0bd8ad6b7155361dc",
+ "lib/meshchatx/public/assets/InterfacesPage-cVtkeZQp.js": "7043132cde70233b1e79845396fbb00d7307f8d293ee095131b4be7c920fc487",
+ "lib/meshchatx/public/assets/InterfacesPage-fQMOZ4y9.js": "15368c12a9801a265237d3f3bf8b82033833c215b486b7ba45f566caeb9eaf9e",
+ "lib/meshchatx/public/assets/InterfacesPage-s-bbz0cT.js": "4d0d337c473046a6427528cb1c942d3f405e5d3f1a4be56260e7fdae4318a18d",
+ "lib/meshchatx/public/assets/MapPage-B0XYXEb_.js": "0b2865d8cb6abf6141b728d858e310c572c75972ae534b84c82cbd6964b1855b",
+ "lib/meshchatx/public/assets/MapPage-B6E4IMGb.js": "2ea7e8547d4bdd512fdf213c3e4e262e9fefe4268ac0830f4ae8e6e70059c23f",
+ "lib/meshchatx/public/assets/MapPage-BH_84XDd.js": "227048268485cc3e2539dfee1bd2034751da3b95bcbaf734068c0f0e324ca949",
+ "lib/meshchatx/public/assets/MapPage-BJq0AFv1.js": "1d379b48d6f5502f3ba4af4a56d29adb387171aa546008cd5b22c157fdfce088",
+ "lib/meshchatx/public/assets/MapPage-BLd4rfbi.css": "ba3e4e77c15d60098baf9097fa691e517a06d6caddf69ed1a03a5d8617a58c8d",
+ "lib/meshchatx/public/assets/MapPage-BPQ-qtZn.js": "f735ca520d41e7839dd398fd1e1e58e4ff3ce629f85e3ecfeb37ffa604cd7957",
+ "lib/meshchatx/public/assets/MapPage-BXb3DCaj.js": "4bdeb6c11209f0851ffa56320016c969909825a0fd928310702809c6c2ce53ec",
+ "lib/meshchatx/public/assets/MapPage-BZ5D-xHr.js": "8ddee5ebafcee1cc7e62cff2507951a69100d0116a6b0fbe5cd05e6be50a41d7",
+ "lib/meshchatx/public/assets/MapPage-BsSuGB7U.css": "363b6a79d3006ec1f9d7408f68d1e74a4913f7d4c2fba8b5f9365ae22ad63732",
+ "lib/meshchatx/public/assets/MapPage-BscXmA_E.js": "f92d188c4afc28dbd0a36a1fd0b9070bc64d90707fa0d2eefe0cc6f869428a7e",
+ "lib/meshchatx/public/assets/MapPage-BtS0PlIc.js": "420ce457cfbfe878bc492f55e23958d94213251e7930a21f549b48fc91f83c1e",
+ "lib/meshchatx/public/assets/MapPage-Bw5IYwuF.js": "02ed3ef11aac8d4166699a2892b8000d1dcaac7718052628607b3173c6046f16",
+ "lib/meshchatx/public/assets/MapPage-CMFf7rDs.css": "6ac1628fd5ddfdecaed27cde430856a39876ceff82b7ffe81e2e71c275d174c9",
+ "lib/meshchatx/public/assets/MapPage-CT51EQsq.js": "8a15a6349c46440ab2b0ef88827de3b87d187798e5b95322a5543293be1fea2d",
+ "lib/meshchatx/public/assets/MapPage-CXzhmmQE.js": "b9e431d440b3a93fc4f29404ee301c306a07fbe9883e430040ec0d4a94d1a565",
+ "lib/meshchatx/public/assets/MapPage-Coz2HXkW.js": "94722dd14c824edec7f4ad474afe4bf6a97e8716529feaa6efff071301f46f69",
+ "lib/meshchatx/public/assets/MapPage-CvnvsezB.js": "4cffa5d8b88e29a32e1282154bb99b5ee927430e7f703571a15a5ab6ec57f65e",
+ "lib/meshchatx/public/assets/MapPage-DNKwPg3D.js": "c7ae2ebbbaf1c63e4434aa1e038e7c8863177b067259ef2ee2c855c0e699a45b",
+ "lib/meshchatx/public/assets/MapPage-DrAjZhQB.js": "4fd9573942b463b55a0fe2b71d53e537714699d759a385418bfa6ee14b60f7e5",
+ "lib/meshchatx/public/assets/MapPage-Eo71eMvW.js": "ee05b8df42b77309edd1dc7b2e03dc0091d5cb62b7466d252c5c0e4a39e1b266",
+ "lib/meshchatx/public/assets/MapPage-MEfcwtYj.js": "bcceda5970102ee5e1402fef2fa4e4c7b95b7e9e713cdab1be1169d1c778cbc4",
+ "lib/meshchatx/public/assets/MapPage-V-HR1n5s.js": "2f1495c1b9965707392aa18b5f29d8e8e31679c1a5ea44acc711812ee2edb689",
+ "lib/meshchatx/public/assets/MapPage-bENFa5lt.js": "feb4e79151ae8f33ce45a587ec27f4b378faf84475bcaa0a1921859def670cbd",
+ "lib/meshchatx/public/assets/MessagesPage--b4Wkkmz.css": "f7570ba32576861d4451c7258b68b2b3a6c61f3d0d20b3f2d31e608e11700337",
+ "lib/meshchatx/public/assets/MessagesPage-B61ii4Fu.js": "496cd8b3c5d389764a3e7190adeb3535ab10406a6eae0614b4950d1c9c95a65b",
+ "lib/meshchatx/public/assets/MessagesPage-BF2U2VwR.css": "cf00bca52630bbfc7778444cc22718191f4e88716db7d88f0b93bb543ee2ca1f",
+ "lib/meshchatx/public/assets/MessagesPage-BVpsGmWC.js": "4095c4084da602868c0940bd85327d92178d6cfdfaa8e5bd4aaf3439782be3f1",
+ "lib/meshchatx/public/assets/MessagesPage-C88C1Xta.css": "148fd8eec5e7599cc138f4351df7a92046ce0d6798f725d5258869683d63dc5e",
+ "lib/meshchatx/public/assets/MessagesPage-CAEN_2MV.js": "1f59035de93b2f8655a58196fcc4f98477ea20b443d83dc2f099890c1580c7f2",
+ "lib/meshchatx/public/assets/MessagesPage-CNFsm2Fh.js": "2e24f98ef452bb49c086431a6fdda90691ef76fe4ad69bb7b1c1a1dd6f0bf7d4",
+ "lib/meshchatx/public/assets/MessagesPage-CQNx2QWQ.js": "6ed122ce71e914b539bb3dad4834ced5163e5b9711db6c7be9eb859bf9c09dc0",
+ "lib/meshchatx/public/assets/MessagesPage-CRDsD-DT.js": "bf646c9a91a7a1a832fd31ebc1c33ad38bd28c761489b3f14f9215cc343cb447",
+ "lib/meshchatx/public/assets/MessagesPage-CUmqFQTq.js": "a769783cea4371cc89dd49243dfd4bd9cc460f10c36f7366c93d82fd22f88843",
+ "lib/meshchatx/public/assets/MessagesPage-CxK5eF6i.js": "a9564996fefcbe6cfd7141f561e19bb6a92c47b29a3dd34ed9d61cae478f98b5",
+ "lib/meshchatx/public/assets/MessagesPage-D7cLbQ9T.js": "b5ccdb25280135468a730292797fe4ddd7f6e28d22dfc2997c9ec38d974832d8",
+ "lib/meshchatx/public/assets/MessagesPage-DL8Ws2UA.js": "7c0e33cfb316078145a42028ce94922d2626cc800484e5817a2c0d3f236524a0",
+ "lib/meshchatx/public/assets/MessagesPage-Dh3eLASI.css": "570321b3601218331b24078f06c7b40cb7e2e739afd8111bbffd4606aa0b4e04",
+ "lib/meshchatx/public/assets/MessagesPage-DhZT4s8A.js": "ced00fde1a1401059fe352e4a3bf411c9afd77b474da4ad89d21f724ccd31a71",
+ "lib/meshchatx/public/assets/MessagesPage-DpjT4gW_.js": "ab47d8b2e4908f30fa123b1e67276705e6d62289a3522df8e6fc5a76b336eaa3",
+ "lib/meshchatx/public/assets/MessagesPage-Dqh-J0Od.js": "ab22c9f13eb0d5876e01d68ec0f45204884cbf4ffd272ff87905004c48451e9c",
+ "lib/meshchatx/public/assets/MessagesPage-Du-48GAP.js": "79e0f9f3d430554ce42b234970f606f23dae34951f385c2a9356507a9928f156",
+ "lib/meshchatx/public/assets/MessagesPage-DvFnDOIP.css": "5787045f5c79d86259fde1fe5c8b3fb5e39ec73c7ae819817426309831919ab7",
+ "lib/meshchatx/public/assets/MessagesPage-Hu-e3LT8.js": "08b878369365367dfc2268d18d7301477e9b3dab4eb8dc0955ce84ce41d2c0e9",
+ "lib/meshchatx/public/assets/MessagesPage-NF3gl6RX.js": "36880373b540cb128d1711302d94071a8bbeb7a771bad705a23ede89cc3c9e50",
+ "lib/meshchatx/public/assets/MessagesPage-bEGvW-60.js": "cadc06961d54d4c25b54193fa2b458f4b085cb1f6b977d230590459b81f09c29",
+ "lib/meshchatx/public/assets/MessagesPage-jKakSR6S.js": "0ff478841e8836f0a25e7dc735d3a70993cbd236c599a0995bfc56b06ca12779",
+ "lib/meshchatx/public/assets/MessagesPage-oFRIoqSr.js": "0aba7d2d1c6c9ad26ebcf2790c099da6ca84e50b9a1b8e633411a70f645a9bed",
+ "lib/meshchatx/public/assets/MessagesPage-pwpd76Ze.js": "fa1a2b018ed960752a3e2d194a10e57df5b169a3904111c7f108ad95b315a5b2",
+ "lib/meshchatx/public/assets/MicronEditorPage--WEqT3jg.js": "bedba40e087a5784a1098d6b7aae29c0a5a8463909cc88f813f900a654b2af7b",
+ "lib/meshchatx/public/assets/MicronEditorPage-9474FCyd.js": "0f5b634bd5025c9aadefd61968cda8d7b2931114571f879b4a9045a8268a1896",
+ "lib/meshchatx/public/assets/MicronEditorPage-976EAUIE.js": "e4e3f9fcdfc251a0a120f223651c84192c565d3ca83ba53b304952f9c945b1f1",
+ "lib/meshchatx/public/assets/MicronEditorPage-BBK1A7cJ.js": "7c836c05853341cde4fecfd845e241f2e93627212a88592bf059eda1f4121698",
+ "lib/meshchatx/public/assets/MicronEditorPage-BCfmF0Wu.js": "0d999ec2b7df643461725ef07ecfacf3956ee00d6eaddf71038735f3601aeaef",
+ "lib/meshchatx/public/assets/MicronEditorPage-BDnlIDRb.js": "9fb055f8d44e813c000203d0f70e6479028619341a40a29bf97af001e0f8e70a",
+ "lib/meshchatx/public/assets/MicronEditorPage-BEdSGsGl.js": "73f89cc0c3ac2afc2a349b70b10328d3dc3f978a057806ef6facafb1e2ca6062",
+ "lib/meshchatx/public/assets/MicronEditorPage-BH3qvvuF.js": "d08db84c0e551de6932170d4e61f47eac2dee80cf8a426f6528ae3835f8cd0c1",
+ "lib/meshchatx/public/assets/MicronEditorPage-BPN_tKAj.js": "c9de06c8c5fa69545d090cf4735cc36789580cf653ea4c157ffe6717f71de649",
+ "lib/meshchatx/public/assets/MicronEditorPage-BljohsXU.js": "08e17145a05c7487d8d27df6aa4f44b0a51d4511c02a7cda84a39b2e4ea0b789",
+ "lib/meshchatx/public/assets/MicronEditorPage-Bp0OQGCk.js": "0f5f283ea6649fcb729e97b2098a9086b9bb653a895e742ebaa26decae65ecf6",
+ "lib/meshchatx/public/assets/MicronEditorPage-CdnSK4Uo.js": "a010f2c15924f8aef47907dbdf81217ae3a0fa6915cc9996f63d009b4a1d55bf",
+ "lib/meshchatx/public/assets/MicronEditorPage-Ct9TtKxc.js": "31cfd93234267adbb1c5f58995f767cbb449a3145a2b45925bfc3d1b78a58171",
+ "lib/meshchatx/public/assets/MicronEditorPage-DD85pikX.js": "1a35027d1104d65940feb305d34e32c86a43f8be6cab8a90217629efc7db4682",
+ "lib/meshchatx/public/assets/MicronEditorPage-DIIopU7C.css": "0be40b9c9ab8f83f00ec13cf9fc10e64919159ff7216c4372a51d56846894c09",
+ "lib/meshchatx/public/assets/MicronEditorPage-DRot3z-g.js": "867c7187a1e4f0dd77f5e891cc2187b977d0dd5d217dfcf3702bdf2157f42585",
+ "lib/meshchatx/public/assets/MicronEditorPage-DTspJuUx.js": "2e75831a4a7baedee6bdc62c8d23460a2da4d5d680a566f397a5bf843675bc7c",
+ "lib/meshchatx/public/assets/MicronEditorPage-Dky2E00O.js": "dd81f19e9c6b24f2281bcee3b6dda33271739d7e9dded6963c8d5134bbbc3266",
+ "lib/meshchatx/public/assets/MicronEditorPage-DwnzZIiG.js": "d04289bf13209dc38bf468b251574367539c343409863b3a5a7c0ad6a6c0035a",
+ "lib/meshchatx/public/assets/MicronEditorPage-WPZtDcMa.js": "cecab947536885253b085a126417bfff9005a2c860891900c389a225a30d2a3a",
+ "lib/meshchatx/public/assets/MicronEditorPage-r4qbXEV_.js": "bf6a408d57acb7bc2b7dd870268c5626ef7a612913c96d39a6ddc2559d7b00ac",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage--VwAGE17.js": "912200e3d8e05aa651d0923f954f865a821e9725feaed761c0b4d3b7d671fb7e",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-6HbZhKrv.js": "995e639984fb1e476fb0cac9958961a13bad35b5c78bd93d9007150308bd44dd",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-8ldrPBdg.js": "3aa7dc00f60dfe7da6d8b89f19ac2782e5da1a50cad76f85a12626437629a08a",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-BDZxaSEp.js": "cce59294587c2a9ec808d3e1b987d77b4894ad1d560e126602f4a7ab1165831f",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-BloCX2-J.js": "7f740fb0be6d44d87007ee53deced22e59c97a362f8855cbc8920f24c81fce46",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-BtNojdhI.js": "a7d40d0e0f9ab1a9ea61fe29b71332dc84e9e57cde7e088ca2b31e5cc750e6e5",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-BvE1g6F7.js": "259df4f4b3142f5d0ea8118ed921028ea191e9995425edcb21f8bd8f4bcf7c6d",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-BvtorWAa.js": "87979f662e9e4b1cd7446bc7d52a7a2d4a9c2a21f0663fa44490ca400ee68298",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-C8FN5v1Q.js": "dd52a894134bc261d28daecc1e81bf63dfd282fa52aa91c6cc900c57c9802915",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-CBTVsRc-.js": "feb5e5b7ec33c934a6ca1f24e089e7c449a061597a749762dfefef35e06397e7",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-CN0_L7zc.js": "6aa642211adfc6541a0fda2000e69f3a0fcbf3d3d24d19b5387fe86588841185",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-Cr4wxUcz.js": "ff9258c107ca71d8e730affff883ad765b35584f532770dd467790f163dae33d",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-Dn4VoH5z.css": "7d0a1e2356c59fba617e055c685a2eb25fbbb7b720cf631afc7a11b1bba34eea",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-DscY03Q-.js": "e6c70fef298e1ebd676a7f834ba1072fe436fea1a4b5e0c276fb735dc7e8697e",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-DtS-D5Hu.js": "b4e64c4d47b3dd0afa2c6a7bcf67bc8a0587f0c95c05922f645034aa9bb05eb9",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-LIs4u1pt.js": "7d7e553f04575225659d6ceaa018ac999808d9f6ea7e60abd5c456533c37db2a",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-Z9_V0oWs.js": "fd14a74bc258d981747923b12c77eb2d34f7063e87c9d2c0979f3f2d78750f56",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-ZF3d6qt6.js": "3417e5e80b6eaad815bbaede43bd7aa674b7f7c94a698c5145d9bc185e2ddd37",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-bODOn8Sk.js": "410d83434602664b68c62e5795509d9c814b2dc2e1a8d6fc68bd3380adcd8c4b",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-m92CsmaM.js": "2718c0c31bcb5551ea1be5901e3952b2a26d0ec90eac4a3ea15acdf5952b6995",
+ "lib/meshchatx/public/assets/NetworkVisualiserPage-veyxCtSv.js": "ac2fb50a11f9ffd94467f29c83d93e2cb7e866686324aeefecba60f5497123d0",
+ "lib/meshchatx/public/assets/NomadNetworkPage--nZVf6wV.js": "6da1a86a34cf1e7b6c0bb0937d126ca48a7723b19d13bbfbfd8869983cbbc22d",
+ "lib/meshchatx/public/assets/NomadNetworkPage-BEqPSuu8.js": "bfea82c51f2e9ca1c78e8825f9652e7d495d7feec707be97cf9377165b5e8f4d",
+ "lib/meshchatx/public/assets/NomadNetworkPage-BYwb_6pU.js": "695d3cc1b51e9b0b2c29fd09d7a900d8513b8030dd2f3b84d20745fb377fd8a8",
+ "lib/meshchatx/public/assets/NomadNetworkPage-BfZmUe0y.js": "d6aa4fc064f83f595929497cde4ae7fddb3f1bf7f222f5075c36dbb718bb3654",
+ "lib/meshchatx/public/assets/NomadNetworkPage-Bo8owhTU.css": "1f5299f7bac61900cbfaeaaabfd6256df60aa7be98986301a6e3e52b84ba6998",
+ "lib/meshchatx/public/assets/NomadNetworkPage-CUUy1oU2.js": "e280cc7e6ad16735c69734cca855902a6d27619e55fd029cfc7995a9f638a88b",
+ "lib/meshchatx/public/assets/NomadNetworkPage-CWAnzZ1T.js": "4a8a368800a8b4b392a7bbc96fbbe25fb8169c0376dd6da637ad02c4278bb23d",
+ "lib/meshchatx/public/assets/NomadNetworkPage-CYSpqOgP.js": "62a3398b493b3ced17ed1e5c43c3a0f461cd6aedd6472ce62c49717e59c10887",
+ "lib/meshchatx/public/assets/NomadNetworkPage-CamExDiU.js": "11045fbc6450f3964b31cf3672717b97ec758903b76898d14606a5e97cd5aa0c",
+ "lib/meshchatx/public/assets/NomadNetworkPage-CodVPnoU.js": "22cced8c83fd77a6fb07bdc64d6683866e07b10e7f0c8af441a5e2f35245e10d",
+ "lib/meshchatx/public/assets/NomadNetworkPage-DFZNgTOH.js": "9c33dbe7d486dbc69b5f648b546a7adc20a6b4bb891dd3d005329475cae02dc3",
+ "lib/meshchatx/public/assets/NomadNetworkPage-DMPAhzup.js": "bac6cbee021c9a6abe918d136320d47c2b7045cbd74f09cb4d05103dab3d8129",
+ "lib/meshchatx/public/assets/NomadNetworkPage-DVhS4FAr.js": "e4c02cb86ef491ed688544cc1c5ff8e555d4be7c318000edb51441d46df46abb",
+ "lib/meshchatx/public/assets/NomadNetworkPage-DcVc1rHg.js": "5fdeba15fdbf851e105db4ccea70cee8ba82691eb31015c0a00a763a3f9a19e6",
+ "lib/meshchatx/public/assets/NomadNetworkPage-DnB6nLtl.js": "186869fa630e44007212160f4f39af1a4e7f865ca51ea1f75a2eb943d2dd2143",
+ "lib/meshchatx/public/assets/NomadNetworkPage-DsSzKmA1.js": "efc383c8fb6ed7690388c4ba242790e94461a9cb8c4ca4a9c64478338fd65044",
+ "lib/meshchatx/public/assets/NomadNetworkPage-Lmz1epzk.js": "6751a0618c9e70f96555627c2d99a1de182a5f64a3d1a8cfa5bb48a23e41118c",
+ "lib/meshchatx/public/assets/NomadNetworkPage-MSgWwiBK.js": "f27cd7706a29f5ce8a8f24bcaa95b7be2d250ecb09dbda1dd8ed97ac07f3e73f",
+ "lib/meshchatx/public/assets/NomadNetworkPage-QTjm-B6C.js": "cdbf955e3a5742a5891b0fcb32ca900eff8fdcfdc8cdcc10628dc45a459890c8",
+ "lib/meshchatx/public/assets/NomadNetworkPage-VPo-EVAj.js": "f2d82299408062ef154613716b3bb3c48a09d2d2918e6ba2ea1c72e2c8c31086",
+ "lib/meshchatx/public/assets/NomadNetworkPage-tfP4kQ4u.js": "648ebcff2daa09aa170c266c689d2c9d172441ae89ba558b93d51b4c3812089f",
+ "lib/meshchatx/public/assets/PaperMessagePage-BNCpEUaL.js": "37e7da26ed299d23062c931c33b995451bfc28809bbdbb8461da05e628944a08",
+ "lib/meshchatx/public/assets/PaperMessagePage-BaF3Ut5B.js": "b28563c579d55ad363e115f4786ae9a24fd572fabe076a71af790ca5709d37aa",
+ "lib/meshchatx/public/assets/PaperMessagePage-BrAvwrKv.js": "cc9b8c171ed0a44a11e45c99d980a408a923afe7836388da60eec03b8125fa44",
+ "lib/meshchatx/public/assets/PaperMessagePage-C9k9SS0q.js": "6fb204be6abe32835eb3b590b6112f172c527c47776cdaad60c03e08e5c1e562",
+ "lib/meshchatx/public/assets/PaperMessagePage-CC8g-I04.js": "d8d4dddb5565ef0ccf868c5dc4fe64d78431a72203a0ff6fa43fa39a8cb0b036",
+ "lib/meshchatx/public/assets/PaperMessagePage-CE9vlmu4.js": "703ed77290fd3310cba4f3edfc8a11ec6600823ee0c358e38122ea6bf7c055c0",
+ "lib/meshchatx/public/assets/PaperMessagePage-CPzgyW2-.js": "059d204d8231a79330b020d3d16d1c56ef8592a230a0e5daad17ba22ee4f4d88",
+ "lib/meshchatx/public/assets/PaperMessagePage-CR1V2V1Q.js": "d696929efe4bbf5f429bcd81496c976205c7c3f825ece4a0b8cf989a16de4454",
+ "lib/meshchatx/public/assets/PaperMessagePage-CR2WQUUT.js": "cbea36eed1fae62c181af7125fedfebcdabcaf67d4a1eae2f4b399e6ff233198",
+ "lib/meshchatx/public/assets/PaperMessagePage-CwTlYRnA.js": "6f1a74dd40d2c2e554dd6ed398b63049780afb905d71259613de8732b44e6d32",
+ "lib/meshchatx/public/assets/PaperMessagePage-CxO-Nb-0.js": "1cbdc4089c95abd1bb1262f7c5b3479968ca1d515e87bae541cd2aa8d90ab6fc",
+ "lib/meshchatx/public/assets/PaperMessagePage-D3Cx3Pe6.js": "8d032d4ee0f767899b1976e017dace4dcfc9c6141ed70d06b3a0d822dab205f3",
+ "lib/meshchatx/public/assets/PaperMessagePage-DC0KnRM0.js": "da6c5b1cb130119fdbc72e1276256f5388d97c48ef3351be403018b2801f5468",
+ "lib/meshchatx/public/assets/PaperMessagePage-DGV26OvG.js": "6ff07c8dc9a5f67a864a9582b372fdddc29aac387143fa3a204cd5f8af77c7b9",
+ "lib/meshchatx/public/assets/PaperMessagePage-DUbO946r.js": "2e7ef1df4126acfcde0a3aa55e90ae840a170054e9c481d632df1020a1078fc4",
+ "lib/meshchatx/public/assets/PaperMessagePage-DWEk-OOr.js": "e1732d589989226b7fe67ad22cf6b538f5e582e9a7a163c21fd014f86b7675a1",
+ "lib/meshchatx/public/assets/PaperMessagePage-DsjRDU4I.js": "010eccb77a7163b29ef8453231c2c76c7b2dd0bb48a637872fcef95c98033631",
+ "lib/meshchatx/public/assets/PaperMessagePage-DsypBSmg.js": "30267a6d3b2aebfdb60cf840665c9189015b3d108478ec1a5200bf224cfe1478",
+ "lib/meshchatx/public/assets/PaperMessagePage-iD5rlYTd.js": "d23ae2b554b231ecdc7ee34e0cfc23a92a2837ed2387cb33ba285dc2c0d10a51",
+ "lib/meshchatx/public/assets/PaperMessagePage-mJGpcVHl.css": "bf27a06adc2d396d3bc30145ad14051877a21ada4435ca8115283bba69e7db60",
+ "lib/meshchatx/public/assets/PaperMessagePage-wWLADHMp.js": "44cb324770e919fbc456a9ca3684eb6cb9fcabda4cd654a60182b18281af63d2",
+ "lib/meshchatx/public/assets/PingPage-605oZnat.js": "cae3acbfeb55381902726b96bdf364dba3b89aa7267facb73d0449c12376cca7",
+ "lib/meshchatx/public/assets/PingPage-8DCvEeij.js": "e897d5276b2b301b090b43575e583d511e7fcc00386b6aefa27328919d0b7451",
+ "lib/meshchatx/public/assets/PingPage-B1nA7XCv.js": "0a467a82e0a785ea53151dd6b898461c5408b8072935b9f0074aa367f12e5d8f",
+ "lib/meshchatx/public/assets/PingPage-BNNtwpel.js": "4ac6d361cb8abb2ba5556f0f00b9717331db905846c46a4b521544daec515e99",
+ "lib/meshchatx/public/assets/PingPage-Be1jI5Ws.js": "c70fb31837f876b55d53dad392c039413150e704d7a701ba7aeaedbb0c5166bb",
+ "lib/meshchatx/public/assets/PingPage-C7D9ck95.js": "522a2dfb346b45773495bd8c672bae359d6e2486e8fb03170e79718486d65951",
+ "lib/meshchatx/public/assets/PingPage-CA_r1-ZQ.js": "b5044ffd384aa56366e0bc67880d0961eedc686a75bef0ae7ec8c727a61faf93",
+ "lib/meshchatx/public/assets/PingPage-CBeqTAu8.js": "d9d5e70f41909e28a730022a599af6f00c8ffc077785909458ba9e94323a03f7",
+ "lib/meshchatx/public/assets/PingPage-CYN3BZxh.js": "ec69a104a389bf8b99e05deada955bb8b768d52c8e1b641f26053c281e7cddcb",
+ "lib/meshchatx/public/assets/PingPage-CpQX1R42.js": "00719d5d9932cc8b56d071eb5263098dee39c44e07ae73e88a510691507367d7",
+ "lib/meshchatx/public/assets/PingPage-CpVPR4vQ.js": "c3343fc90293c7884b2fc97248c2df7730d3424542ed995733480f1eb1a3b6aa",
+ "lib/meshchatx/public/assets/PingPage-CvqXFI9h.js": "9dff7fca0683fb0c11a962d050536c9e367577e97833bd75901ef5b57fca746d",
+ "lib/meshchatx/public/assets/PingPage-DFZmoCHH.js": "9438d54dee0bac8361b2addcc66c749ba5f9be81da06015663f3bf4ebe11580e",
+ "lib/meshchatx/public/assets/PingPage-DP51KWFg.js": "a7102d863bb393007c655cd34e7d4f3131367d1303ec2bcb3202ab355bf7fb35",
+ "lib/meshchatx/public/assets/PingPage-Dxnwuj7k.js": "2e4e5577fc06745d21f293035a41fb71e37ebbbf30cb11c93738af37e9d48434",
+ "lib/meshchatx/public/assets/PingPage-GbQtaXL7.js": "3c18baf3a849db5d8293d54cee7159fe2a8d853cf4865827e90aa067a6ee730e",
+ "lib/meshchatx/public/assets/PingPage-U4P81pR7.js": "652a19ef53a979842e38ee1910b196cb09a6655e16ba1b653b792bd798c39674",
+ "lib/meshchatx/public/assets/PingPage-jV34_kWA.js": "3f1971ea08110ecbe8aafd5d2391cbd774315048c13381626fc12ab6a901946d",
+ "lib/meshchatx/public/assets/PingPage-q8ykEogI.js": "2b8044568df6f10ac934b45944e17479b16b74fefa58ea1ea96c64e118519462",
+ "lib/meshchatx/public/assets/PingPage-wGol-jpK.js": "80a2d4b926ad5ce5810dc9c23de5ce547cef8b33e2fe688003170fa8d9446857",
+ "lib/meshchatx/public/assets/ProfileIconPage-BD8um3u5.js": "d8539b579d44bf5241e0bd3a0de2e112d4ec22c76139222ff67cdaa626f00873",
+ "lib/meshchatx/public/assets/ProfileIconPage-BODy1ADP.js": "98e3006064df0e54dbc8b82e94ad7f2afc29ac3529114d6930358719cc243980",
+ "lib/meshchatx/public/assets/ProfileIconPage-BWQJwqVh.js": "e9733ff0cfbdd95b46ff8bec57a20603a2b2a4cab080e0eb13b988c9121d8bce",
+ "lib/meshchatx/public/assets/ProfileIconPage-BkGnbcAy.js": "26d75d8beae39d0efbff4f4274eb592d0cd8708f6940e4eac2f54d308694dda4",
+ "lib/meshchatx/public/assets/ProfileIconPage-BtfXSHS1.js": "e42d424139f7177ea67e9cdc6c6d17022e8366a1a2ea919924faee97a2a13a22",
+ "lib/meshchatx/public/assets/ProfileIconPage-BuLRxDLh.js": "4ab27a738d6c86b6570a92efae3aa95b62d05ff19c63db04a12ddee55136ae67",
+ "lib/meshchatx/public/assets/ProfileIconPage-BwLzG_fH.js": "93d54bfa9a1bd718fa4cac24b54944ad678158ffaf57a941f773297e1dd67dc0",
+ "lib/meshchatx/public/assets/ProfileIconPage-CE-MQVgM.js": "418e440cec8d731f57f638ca4a4c7e104dbe1a655bec6e87569f67f81cfc3a65",
+ "lib/meshchatx/public/assets/ProfileIconPage-CGj4CTqa.js": "e4294feca7cb8edb9c6ce2ecf776538efe62ab8ada4145c382637251e38892e0",
+ "lib/meshchatx/public/assets/ProfileIconPage-ClZ6J3JQ.js": "4b5dd8253e715db5650144ac9097a9a45afadb2cc06a538a39766dd3ce6beb83",
+ "lib/meshchatx/public/assets/ProfileIconPage-CpEQ7Yyg.js": "9dceb67d757e79c807d5f1dbf1849f478b9eadee21eaea9dfa92be2e8c123dd1",
+ "lib/meshchatx/public/assets/ProfileIconPage-CzfhEjEM.js": "ed580980d6d4d365d98f467e56a44e884e437d1ab006ddf38dfcaa32678c92cb",
+ "lib/meshchatx/public/assets/ProfileIconPage-D-tHvyk5.js": "353890704a641df34db34882ca061db9a76cfc2ed69b80f2a31207798c5fdba0",
+ "lib/meshchatx/public/assets/ProfileIconPage-DDfbIMis.js": "c3a8d462fe4fc6f1756c5257baa8252ebf5b824366749da14f14e3354212e9a6",
+ "lib/meshchatx/public/assets/ProfileIconPage-DcqQYExK.js": "005bed1af7252eb57c1bdcd6afd591fba77f126a42197c6f201be00832433b82",
+ "lib/meshchatx/public/assets/ProfileIconPage-Dq31ODIj.js": "cb0928b38f7d94391c96d8110c966ab49345aa882cb133aba6bcf849dee9d427",
+ "lib/meshchatx/public/assets/ProfileIconPage-DtLNk3ld.js": "53706e3c730a11cc0157da441fb35890f050c28092f4e787a750ac4075c0b8e0",
+ "lib/meshchatx/public/assets/ProfileIconPage-Nafv9Djw.js": "6ffa92b0a3549b66ace1ed267184daccf439e2c827335b869b39620bc88881aa",
+ "lib/meshchatx/public/assets/ProfileIconPage-e3G5YCSe.js": "9bf5f5ffdf1fa88cac8b054eef6907a700a70dfd0fe3495559d0461e82c34f2b",
+ "lib/meshchatx/public/assets/ProfileIconPage-lXDI5s8D.js": "f68d3d8adf327846a4d1644d967a2389e37d4f7aaba49f10aa5e5ad1288ef938",
+ "lib/meshchatx/public/assets/PropagationNodesPage-BcSeS9Oh.js": "6c2cbe7ae57620f030b04cb755054d791419e6b11b1282473d836949f6b4ed29",
+ "lib/meshchatx/public/assets/PropagationNodesPage-BpDBsaK9.js": "1c3bcfe5b31344ca6769192c9f8ba5cb275d2a36337a19af39a45f1646d687d2",
+ "lib/meshchatx/public/assets/PropagationNodesPage-Bs5QHHR4.js": "fb7dbf624aa0c5808dc32194044a30aebbe55a5773410b164b34819d0b523ed6",
+ "lib/meshchatx/public/assets/PropagationNodesPage-C29jypnG.js": "1a402cfe6ac25cfcc28d3bd7604ce7af5650f42dacabc9043a04f146f0fdf3fb",
+ "lib/meshchatx/public/assets/PropagationNodesPage-CFB490RL.js": "b14819a49885b54e9a290581521362552289221c38f1971fcbbb1c1cc0dbe1d2",
+ "lib/meshchatx/public/assets/PropagationNodesPage-CfkUQJzn.js": "46f2690d94afce7b9a26898ed22e736a82beb924f9d89d83555f0ad4adbbfb62",
+ "lib/meshchatx/public/assets/PropagationNodesPage-CrySA9JB.js": "950545402f7f96e64670228dee6756e2810cbf063d739eedc2a946a3030beaab",
+ "lib/meshchatx/public/assets/PropagationNodesPage-D-VHRWQh.js": "b822e5b3e57e790d21c2f50bd0d60f2ecf13c0d5a08a88da6b6103bf7250c4df",
+ "lib/meshchatx/public/assets/PropagationNodesPage-D1EJyBZo.js": "f212cd93629abb4c1f2dcb121ba22473c792969d3072d039a9f79511efe457d8",
+ "lib/meshchatx/public/assets/PropagationNodesPage-D41vW7jg.js": "c301a492a8ce193a55593b9a593d6babb4e1185909055e1057e83e555bb0ab4e",
+ "lib/meshchatx/public/assets/PropagationNodesPage-DgRJ3NNC.js": "18d710653e439d2be54e883a24284e616edd48279b8162b6d4d5a04a47c97482",
+ "lib/meshchatx/public/assets/PropagationNodesPage-DjvSg0ye.js": "df2b4f23c70912ba06a0d6dd969a7e8c6408c9d1e9e263dc521b6572b863f7b3",
+ "lib/meshchatx/public/assets/PropagationNodesPage-DmXJ1PHO.js": "aa7273a38e9d64ef28bd0401e6e142147dbf8074d20ad288846855bd087b10c0",
+ "lib/meshchatx/public/assets/PropagationNodesPage-Dzh9c-1R.js": "044407b1accfc35c00a98096cb390ff01c4f3f6e705e47e9623113c0d2480ff7",
+ "lib/meshchatx/public/assets/PropagationNodesPage-PivWmPbY.js": "29b8070e2f1c4c74bd5cb9ba908a8fce6b220d98f28c7de161f0ac140b84fda1",
+ "lib/meshchatx/public/assets/PropagationNodesPage-QdoqH-DF.js": "b2841eab2f4ba9015647ad52320fb9db007fbb21bf870f5b00adfc6d852e5598",
+ "lib/meshchatx/public/assets/PropagationNodesPage-aJ6q5dH_.js": "3a5ad9e493aeb28148fec23ecbb96126dc38ecb3a3491c1d60a24388342bddae",
+ "lib/meshchatx/public/assets/PropagationNodesPage-dBBjMlwj.js": "d5ddd0e826409f2c500918bf14fc43483a606488c48e3bf12aa3ef7f7c3dc96e",
+ "lib/meshchatx/public/assets/PropagationNodesPage-uqS_uhdD.js": "c7562fc2d49282b1ac3f65979921775cea32851ff4d208eaf73b0d438b144dc9",
+ "lib/meshchatx/public/assets/PropagationNodesPage-wZWgAX0h.js": "a7d6ec9e4562e2e09226bf34552164433a715133494d00d03d5a81bd008c250c",
+ "lib/meshchatx/public/assets/RNCPPage-B4w8obKN.js": "d84eb4b02e52c7efbd4ec9fef1e438a4d04e320fe00c408e25c8f7d582a6a7a9",
+ "lib/meshchatx/public/assets/RNCPPage-BNHm9MT4.js": "aa6d05aa788088669cb42a184572a1e657e2fd3752c46cc0fd9d56d41dfab2a1",
+ "lib/meshchatx/public/assets/RNCPPage-BZmPFdcq.js": "e40f5ceeb86d56eec72029be77a0303ac69ef70ad22bda2721516efe5458860f",
+ "lib/meshchatx/public/assets/RNCPPage-BtJWBJUf.js": "320592191ec00d0aa225a6f055750272e22c0711cfe013476ed5bf2849adec54",
+ "lib/meshchatx/public/assets/RNCPPage-C51Rhf4B.js": "ce3a3d8115d808737e25d75b853f1c99a294b239a37efa1697f8af3027617bf1",
+ "lib/meshchatx/public/assets/RNCPPage-CLVdPZCs.js": "ea9408eb8b1f709bff1001288975f1b939c495f17bcf72488497fc77948434db",
+ "lib/meshchatx/public/assets/RNCPPage-CWuifO8N.js": "5ce0e2cfdb777e61ce9f2741952597576c8a6ba5373dde50e4c09aa3ad146169",
+ "lib/meshchatx/public/assets/RNCPPage-Cd-_YgyM.js": "945b90df6d16e164ff5a411df9718ca7864276d9da5f74f0f60a57667919be5c",
+ "lib/meshchatx/public/assets/RNCPPage-CrlLp6sn.js": "14f68628e9aa2a669cede34bebf7b5ca41141d5fffd44d9af298695f6783c5a3",
+ "lib/meshchatx/public/assets/RNCPPage-DI7MX88L.js": "6638e5b1847e9c4e6ef6e1ceec14aed7576da2a68ae4e8bc5720c14e21bf99ad",
+ "lib/meshchatx/public/assets/RNCPPage-DLCuqLGc.js": "394b53b1d265847926b5ae568991780e1ef2b90cd69cd7afd8ea5caf5af6b55e",
+ "lib/meshchatx/public/assets/RNCPPage-DLRqUp5O.js": "284c7222030f948aafc5e3f28a0713acf124ce9433bebeef9086c92cfce1e84d",
+ "lib/meshchatx/public/assets/RNCPPage-DScEWctG.js": "4eda3b5fe8e143cfae990e276e1000aff19e03fc6af2641e23767381c59386f6",
+ "lib/meshchatx/public/assets/RNCPPage-DjZnwIhz.js": "833cd918a561932fb6ab58094e2420ccba8afacbef727b947ab10fc0ef0eef9d",
+ "lib/meshchatx/public/assets/RNCPPage-DkRYbHe0.js": "8dc9862ad7f7a77ac7e523e559b517298c734dd061065b5ad225699b7e28b917",
+ "lib/meshchatx/public/assets/RNCPPage-DmJzoask.js": "6e8fbdb27c643ba75c2e2d0a35c3061ad5faede25dba0cb430c2ec0b48c93ba2",
+ "lib/meshchatx/public/assets/RNCPPage-IAjOvgS3.js": "34475e562c053b1aeeb51ddc7bc17e187b0bac4f8e244f1de716a4de6d27f992",
+ "lib/meshchatx/public/assets/RNCPPage-Vazu-YB1.js": "90628311410d963b3db4c3887d692e7b281c1f15340426853a9b09698f468132",
+ "lib/meshchatx/public/assets/RNCPPage-c0FDPWtf.js": "e19b0d7804856c5257b53f1e6298651e928b0ad8790600c1b602c5a3530174d4",
+ "lib/meshchatx/public/assets/RNCPPage-n6SAd7z8.js": "11a6ddb12363253ac02cde23b12c6c350899ca1a11a457949c5a3d713420d0d0",
+ "lib/meshchatx/public/assets/RNProbePage-B4l8yxQP.js": "d608a7f434672ab7dd29793610b58085a9ef0117757175e70f3d9ee95d02d0f6",
+ "lib/meshchatx/public/assets/RNProbePage-BIk8vXT2.js": "fcf82ca4dc1afa8f3b418a030bf3d6988fce9c515eddd789536fff8b1f750eaf",
+ "lib/meshchatx/public/assets/RNProbePage-BKIWaXrV.js": "5e96a825ac3b3432874384ae49c0d7d5511ead8ff92d9754da0e2ee04b225834",
+ "lib/meshchatx/public/assets/RNProbePage-BPocFDc_.js": "7bb8c8ce6c168b539c11fab16583d4efd98c4584fb212091806789d56cd3bb8a",
+ "lib/meshchatx/public/assets/RNProbePage-BhmRwqjI.js": "339030561bbe2ff01e8e965e53e4b527251d9cbcc1722f35714180345d3dd0bc",
+ "lib/meshchatx/public/assets/RNProbePage-BidNyS1i.js": "a2e0f2ea394cf1a5030caebd4590e936a97f5aec0e7d5ca109c850f6a50f2e39",
+ "lib/meshchatx/public/assets/RNProbePage-BjKRvght.js": "f100b868ad40c2a64a29aa99fcb0c5abaabf0ac551dd538ed1abe87d59b5d02d",
+ "lib/meshchatx/public/assets/RNProbePage-BvM_mqle.js": "34cc1ab6077855ddff0d69b7f8bac4eb574ff67e7a590f0e4935c0ae416dfe19",
+ "lib/meshchatx/public/assets/RNProbePage-BzdcUd_3.js": "dd27703b77dd21ddac38bde4ca6edf4ab53346ce1b819e425fefe52f766086a5",
+ "lib/meshchatx/public/assets/RNProbePage-C4UerEa8.js": "a11dee743d699b68332088931b4059028e71e0f134ad830b121bc846c579511d",
+ "lib/meshchatx/public/assets/RNProbePage-CKfF2j6U.js": "a1ac77ecb045cef88a123c49a2e9d51df562a674d02ad58b11d184a6480fe457",
+ "lib/meshchatx/public/assets/RNProbePage-D3ABqDbl.js": "881a386c7f66bbd0a52bcd1c87318341cc3d9a2bfa8005b46f535cae684f8899",
+ "lib/meshchatx/public/assets/RNProbePage-DBadiIiD.js": "f304272b3e6dd6bc1510f7132f3b29b437ce5dd6c4ec844f41dba80007a66c6e",
+ "lib/meshchatx/public/assets/RNProbePage-DaNPh4kV.js": "5d77863939deaceeb5672d82fed43698166bcd3b2dea06e09da6ed89d6b537d5",
+ "lib/meshchatx/public/assets/RNProbePage-DdT2pR73.js": "703d83f7334f2d973c3a1107463de732e626aa7541d97d70580cfbf2606fb5bf",
+ "lib/meshchatx/public/assets/RNProbePage-DpJgKra4.js": "5667f806e57c3eb3bdcb3d7ccf9c9d53200968c6438728b14628be191d1251a3",
+ "lib/meshchatx/public/assets/RNProbePage-JTwuc4jR.js": "6eae7a3bc772c335e647bb886fa88e091c48c38e396a98d0a7a1de8167e4a52c",
+ "lib/meshchatx/public/assets/RNProbePage-f3FJuUps.js": "24f588621a7ba733067e0cab9f87031b8de144e3d9f707c21eb7002dadaba4e7",
+ "lib/meshchatx/public/assets/RNProbePage-hYBvGAJW.js": "c77416dadba9c37c0fa96b07099fc649693d0fdb29439e0a4c1672e139b0277d",
+ "lib/meshchatx/public/assets/RNProbePage-pZHdmx6n.js": "de5b8e59636c2bb4e16c968c78c85354b4ad2444a32b4ea9ec52f11757e1d94e",
+ "lib/meshchatx/public/assets/RNStatusPage-BEByD0uG.js": "8b9b4eab8e483c3ff9ee5f0268b5f61a847ee82c616284b5d6e8c44a0c2adfe0",
+ "lib/meshchatx/public/assets/RNStatusPage-BLUgxsr9.js": "181956b34a29f769f3e3c4a593f3ad83c1767a1a024773d51279d4d5f3205f0c",
+ "lib/meshchatx/public/assets/RNStatusPage-BMKr50iV.js": "e6493c806b2066cc915c2b3dc077b398f2393d2aaeeb3f3e02647a65e2905b3e",
+ "lib/meshchatx/public/assets/RNStatusPage-BceiBbcN.js": "3b12a91d98cb48e82f02e7544aef46073cbee13d8b2ff081c41c7ac64648b6de",
+ "lib/meshchatx/public/assets/RNStatusPage-BdHwTC35.js": "72a4808601d35076078be711d988459d3202d560d1149844b6548d2242f3da35",
+ "lib/meshchatx/public/assets/RNStatusPage-BdytMz1p.js": "7c064e4a2ddba253abe1b83d34783392625e6232ffa077eeb1b656c1be5bd59c",
+ "lib/meshchatx/public/assets/RNStatusPage-BrGcmhTG.js": "d2414c00cfed6d4c4280d95792765b1d75d7d09f84392c3dea3fea78ab5bbede",
+ "lib/meshchatx/public/assets/RNStatusPage-Bt4n9T2V.js": "0e65f9f5ed8f93b68b76d36831cf9f1e0d847c9e31272fecaa76da1578fd29a7",
+ "lib/meshchatx/public/assets/RNStatusPage-Bxsv2zmp.js": "838a611d479b56733ad854c2246db5987d2a0d0924bfdce41602b4af9cd0ed9f",
+ "lib/meshchatx/public/assets/RNStatusPage-BzMMLgMU.js": "09d3397a3a86ca943a4391ce9c536789eac066ed17db29497d23e7b2cbc0c62d",
+ "lib/meshchatx/public/assets/RNStatusPage-C8bB1KWP.js": "a2d07ffdbab07d003ca7ae310012cd2c2a463e4aa4ac45b3647c77e647403096",
+ "lib/meshchatx/public/assets/RNStatusPage-CW332LiS.js": "b79932f83bafd4cd80977cd546926919e5194e709e93ae05c192cc59e77b8594",
+ "lib/meshchatx/public/assets/RNStatusPage-CWOe58fZ.js": "3b36994a5b6e887c1f1fed3361414aa5f9987b758716fd3c0f69e51bc0973dce",
+ "lib/meshchatx/public/assets/RNStatusPage-CYMG2EzP.js": "8c0f303cc1673da4c4da3de9f36cc1e5e713543fdd9a379aa39be5ef1c157aa0",
+ "lib/meshchatx/public/assets/RNStatusPage-DHVEJlF1.js": "062867d170eee11cb1cce527b710d5736003e7d74a4896e053fe121beed8014b",
+ "lib/meshchatx/public/assets/RNStatusPage-DHhXEvh5.js": "5894df2e4273208476cc1f88d9f027de224c61a4abbc8b0a697bdcae1e60dd32",
+ "lib/meshchatx/public/assets/RNStatusPage-DTAG6m-B.js": "4b8564acbbc45104a50dcae3186ecf210cbc4516b721c29bbf0830fbb37f4d81",
+ "lib/meshchatx/public/assets/RNStatusPage-DyHIMWIS.js": "7c8371dd3c400a31cf0795e3befc0481cfdc24a03d57f1e55eecdc3d7dde5007",
+ "lib/meshchatx/public/assets/RNStatusPage-LNxrqC5V.js": "0ff1be162d4b5c36fe66994164f4606f6f7dca4be994909d3a648207ccfff86c",
+ "lib/meshchatx/public/assets/RNStatusPage-nP-NnBNq.js": "42a63d8ceb7eda9196589ffeb151bfc5fade25d6e5b4ab60c05fc26693275435",
+ "lib/meshchatx/public/assets/RNodeFlasherPage-BlEe_16U.js": "aec2b876192ae6d3a8d023fcf389ccf5eab7e7b9fe08ce242de427ceedffe0ba",
+ "lib/meshchatx/public/assets/RobotoMonoNerdFont-Regular-DyU2aSNn.ttf": "3357fec1cce2d30c9a547ab35f5bd1742c005ce6343096427750bdf160be0a8d",
+ "lib/meshchatx/public/assets/SettingsPage-B2NvFceQ.js": "1e3f221af2616af7a0289612f8023ded731106b07e1e30339f03d5d24bd53379",
+ "lib/meshchatx/public/assets/SettingsPage-BQUh1tUa.js": "817973d93d98e4bb34ccac5dba8587801192e8a0b7fa51be1017008bb0151550",
+ "lib/meshchatx/public/assets/SettingsPage-BTA4iAYq.js": "cb85dde7aa0476910bf0dcceb0bad242a1648f05a6288e67bbf2a50991318380",
+ "lib/meshchatx/public/assets/SettingsPage-BUGPHwtI.js": "32e696172462d5baba26443be246224e55b69770880a2d3ac5a8fd5483cf8c11",
+ "lib/meshchatx/public/assets/SettingsPage-BWB2qV6C.css": "6e1aee2c65ab471e2a4890178ac10f88c3849a59e2c0aa4a8b0c571e1b50a240",
+ "lib/meshchatx/public/assets/SettingsPage-BaHpJhSS.js": "110bb4a3563a16ca0f9df53fbe9552f6a0f93012141a23a9a4f27eb8cac461ea",
+ "lib/meshchatx/public/assets/SettingsPage-BlPc9PlL.js": "e6bf5a61abeabaadf9cc8c1d3868a3cf1e9b2615db3d691cd30e0b605fb4e67c",
+ "lib/meshchatx/public/assets/SettingsPage-BmssvI6y.js": "c9108a55864e8f2088d4708b515f5172b78102ded19096774271b79ff42fd427",
+ "lib/meshchatx/public/assets/SettingsPage-CYfLWd5w.js": "01ca1f7909c2adc7cf633386bb7f9a96182c4b1497f7bc1bbe2db3373e7ac440",
+ "lib/meshchatx/public/assets/SettingsPage-Cb2_nZRb.js": "89042a562891d54d72057f05974c83b898ab607f3a8025a9248fd6c105cf4898",
+ "lib/meshchatx/public/assets/SettingsPage-CnxrWsZe.js": "c9dc0924b67e643038c95a85448cd50d24952bbe93ea4e8ad5d19a31aefe335b",
+ "lib/meshchatx/public/assets/SettingsPage-CtjAXkUk.js": "8469127b83d144af1a7feab00cdb9ad815fe5477c5c2f8d9f73808a5f9cc7156",
+ "lib/meshchatx/public/assets/SettingsPage-Cz0lg0G9.js": "ae091a131d1df1224c04e831c84bdcc639886735975f4ffaf3e25cd1a3d2f442",
+ "lib/meshchatx/public/assets/SettingsPage-D8v1LYHM.js": "edbfdac8b0fff4002a028d4b0d6f0a4f7e59c018841e63933b5d566d582b25f8",
+ "lib/meshchatx/public/assets/SettingsPage-DNNaUueI.css": "94a4efae5d8a2181edb8c0084c6bcd146fa5883d458f087c3595185ce8613d9c",
+ "lib/meshchatx/public/assets/SettingsPage-D_ODgYVz.js": "5b5d35973c93c935f9c731cbd09f8a672bb9e5b58c08438a86e2c69bc50fa859",
+ "lib/meshchatx/public/assets/SettingsPage-DdgbM7p5.js": "3594fb935e9a5588d2e72318e2eaf9e852dadb4a5034166e2073058387a1498a",
+ "lib/meshchatx/public/assets/SettingsPage-KhrqUKXb.js": "9060d18dd1bd03b008a2405fe3fb27e036c3f09b255680b08d7130c81db734f9",
+ "lib/meshchatx/public/assets/SettingsPage-MkP7lVSP.js": "e7ea5e652fb54bed4779fc8db322f715d1cc2dfb831f3f607bc261e8c5f415ad",
+ "lib/meshchatx/public/assets/SettingsPage-NdYUyyj7.js": "025db968ff36975cf2daed3f4ae5b16018dfd45236087d765e4a9afaaa6ca6d1",
+ "lib/meshchatx/public/assets/SettingsPage-Z2YLdAhU.js": "a7e64da0d50c60ec1b1fca6f0ff592d7d685895dc0c599a06d03ee1b9a6b243e",
+ "lib/meshchatx/public/assets/SettingsPage-_E4HIBwX.js": "d4d7cac2313b0a543615e58506f690f99833c883ac6d2b4ee2b26e5956a14275",
+ "lib/meshchatx/public/assets/SettingsPage-piUsDFph.css": "749db426c7e6ac1908c73a6c0a09f9cd69fb1138958d043c026359f5d4dc73b4",
+ "lib/meshchatx/public/assets/Toggle-59RCn4jY.js": "e190819576e499d02f118d1df8c06db03d7be266558d0100e6d3872398ea1beb",
+ "lib/meshchatx/public/assets/Toggle-B23P06Ql.js": "1b5e45f32cf433ca71e96a12d516011acbb087587b916709e3d1fefa6d64eb67",
+ "lib/meshchatx/public/assets/Toggle-B55QR0su.js": "02950f5a68b6fe738e39825dc7dcc5c0afa82677227f723d2013006f978d3a41",
+ "lib/meshchatx/public/assets/Toggle-BHYEi1VG.js": "6ac766ce0ce10d61e286f0256b6f31fd95923571e8afba7e05bbaccbf6c5800e",
+ "lib/meshchatx/public/assets/Toggle-BIziF9Iw.js": "bee87aa9038b535997584f6a1692d54b673e78d40e4781719bf652b8359a03aa",
+ "lib/meshchatx/public/assets/Toggle-BJ3cL4O6.js": "e8b719abef326ee4c5a98c6b32604ed50c0eb2b169d0757039be55980d59b68b",
+ "lib/meshchatx/public/assets/Toggle-BOBxd7lv.js": "9da76aac7f4801dfa49585425c45ee1a41d870730fa86aedba2d300283dad3a7",
+ "lib/meshchatx/public/assets/Toggle-BrG7ascc.js": "395c73f3f1c433d3766fab564eed61ea3ba1e895ed7f16a6777c86b4163fcf07",
+ "lib/meshchatx/public/assets/Toggle-ByyvHWcz.js": "2ae6a710b117555f6b518435c2cec1a8698077a4e1e3bc0237a0e52cc00ab0b7",
+ "lib/meshchatx/public/assets/Toggle-C1eJWi3P.js": "28a4d307b0747821c42e1effa69f2483cc33c8a058dc0961d581087c92e5531d",
+ "lib/meshchatx/public/assets/Toggle-C7yZtT8y.js": "4a31e89c1740bf907060cda0ae313fcc1fe6dffc9e931385a52718bbc743620e",
+ "lib/meshchatx/public/assets/Toggle-CDqze-uV.js": "581f0b6631799fe8351eb639eaeae77fbeb414797ba376425f59c93faa70286d",
+ "lib/meshchatx/public/assets/Toggle-CfxT6VP3.js": "e32283617de5e6488b5104bf4a976265fa8edf562faa28bcc8efbfc40e972a99",
+ "lib/meshchatx/public/assets/Toggle-CvZO6wRO.js": "2382f825d23591b759638762352e216867c3e16bcfb6de05b848ab7cd52377e5",
+ "lib/meshchatx/public/assets/Toggle-Di6uCFp1.js": "6cb9e7aaa5f99c1935653b5d67cd3e4955e68280a80e3d3524b22a33627715cc",
+ "lib/meshchatx/public/assets/Toggle-DzZB-Ca-.js": "caa25fee9d0e1639382fd21ac5874c0cb404791ab92c98575153e241a47e53df",
+ "lib/meshchatx/public/assets/Toggle-KICF86_Z.js": "73c5d62feec43e4689a84d08d172ee564ec127e8d23ae707206220f245feabd2",
+ "lib/meshchatx/public/assets/Toggle-pfLCooS1.js": "d379760972f52e18e054a447e6010aeeac1d2c011aaaffa5dbd154e5f8c81649",
+ "lib/meshchatx/public/assets/Toggle-q0STuMn3.js": "84d6968318b4d0d3c2284ceed841eee6f44e9c51a803de564624474b1a9b34de",
+ "lib/meshchatx/public/assets/Toggle-qWK8RBtX.js": "05664494a7771378dbc527ce656d0c333a8799b9f9dd0624b43c6d0926c3f584",
+ "lib/meshchatx/public/assets/ToolsPage--Z10aTLi.js": "5a2361fcc06573315270a10bbeeb16984d0bd8c3cf56d7deb5135b10879a9afa",
+ "lib/meshchatx/public/assets/ToolsPage-B0FlDgbf.js": "3ba77f6b36b4bddcc2df5651ed87441762ccafd8c7e78fbdd94a48a76412fe6f",
+ "lib/meshchatx/public/assets/ToolsPage-BAorvmOt.js": "a2a09143a3421c068aeab24efdaed1e7145e3748d1c62f18bc8678620efcb1f0",
+ "lib/meshchatx/public/assets/ToolsPage-BE5NkXQB.js": "0a278f92cdbe177e13ca9fa6cedf774698f3c9f6b6f4e690cb3c5bb9a8ff67fb",
+ "lib/meshchatx/public/assets/ToolsPage-BPN9J1bu.js": "b85977f856521310e5eca3524d655323afbd4c52052637b49d5a98abd8a2867d",
+ "lib/meshchatx/public/assets/ToolsPage-BY5bRSRr.js": "2391ed3b659feab337ce254a150a8ba798a409ebf8139569b3ee8d5fd735cb45",
+ "lib/meshchatx/public/assets/ToolsPage-BgNfJ8fh.js": "57546c75f72bf14e66c4769da529a4b7cb95f88ed7f2dd2127937aeaaccda18c",
+ "lib/meshchatx/public/assets/ToolsPage-CCZUezpR.js": "f43dbe17e466c75d05e1f7d9fad87473c55627ffb0e2091d9f1f7df0b1bb7201",
+ "lib/meshchatx/public/assets/ToolsPage-CIL1rxRX.js": "3929db20ca506dd8a0f5d472a05020b6d17ff19b05d1f5fbfc4de29c06a3c6a5",
+ "lib/meshchatx/public/assets/ToolsPage-CPSXRsrJ.js": "6be53f8324013a9bf5ad594ef306a855153dfc61fbaa4ab7ca78b788ea2ff356",
+ "lib/meshchatx/public/assets/ToolsPage-Cew0Sqhi.css": "e1b9d743705fa603a58891abe0593e8926429aabed9c8cd5d691bdc63a879e27",
+ "lib/meshchatx/public/assets/ToolsPage-Cm6ojBq3.js": "ef96587aa53a4d8c372a6568d023766a15f855cb1285bcc5ec60736b5fc4b7df",
+ "lib/meshchatx/public/assets/ToolsPage-D-IbKVrq.js": "a86c77d33d8d74e3ec54ff4a44134f0d0fcd7d9476a3b7f0f5337416fca56d08",
+ "lib/meshchatx/public/assets/ToolsPage-DCqZsXeh.js": "0915f4ea91b2fd2245268693e263c2bab301e9102cbe3c9cc4ccbc5f6504639b",
+ "lib/meshchatx/public/assets/ToolsPage-DHKGnt7Z.js": "514cb6228d057782556f7339071527cfc18e8bfddfb21ae90692feb252b7d71f",
+ "lib/meshchatx/public/assets/ToolsPage-DTD8UxZd.js": "d91c74ee0ac8a88e73c60630edd6cc2081edfa503023dd00d266d65cf65f630c",
+ "lib/meshchatx/public/assets/ToolsPage-DWpU2afb.js": "98d2bb2d51a8ce7db8d76bbb11ecf314eee807bd69b55b3c47cf60eb0c37dd90",
+ "lib/meshchatx/public/assets/ToolsPage-DfjQvRAF.js": "f03a9b547353041bd26219408e1bad31e9986771c96e3a8c692fc62ca49b20c5",
+ "lib/meshchatx/public/assets/ToolsPage-Dnc_orjh.js": "b1d79f9bfbe3f62b905b060100c9e4790834210fb02473ffd0318866966457c5",
+ "lib/meshchatx/public/assets/ToolsPage-DvDwVZ8q.css": "8b40bbc801fb539e2346d30fe073f355e22a7c6f4f1fde6de2e4ea9ddd46d0c9",
+ "lib/meshchatx/public/assets/ToolsPage-L38MWtvZ.js": "0dad49737c44ba1114cb0bdb7b8799f9ec0d49f0200c2a6d8af0355c4f95ae40",
+ "lib/meshchatx/public/assets/ToolsPage-jGJtt1FO.js": "8fe7a078df4e0f36d6cf8ac4fe5dfd1db3cdd511cc5cf730ed1fd51662e1634c",
+ "lib/meshchatx/public/assets/TranslatorPage-2Yezyf6n.js": "bcdc4098efae54479ee44c4a19f76f8a4c54dffdf580f979d005318ec6805979",
+ "lib/meshchatx/public/assets/TranslatorPage-B9lOpJC8.js": "952cb88dcef6a892dbc871ae5b69def1f4fdc3b0d1b010e5d32dabcb1d8548f3",
+ "lib/meshchatx/public/assets/TranslatorPage-BBnOy-9j.js": "3b350824bea7bb7abede2d7d4be55626706470ad69719547527e817b6a9a3e43",
+ "lib/meshchatx/public/assets/TranslatorPage-BhB_cOYa.js": "dbfa31d1769aafa320be2de0b3e5c7d520296f8a57dae24777c56f59fe679271",
+ "lib/meshchatx/public/assets/TranslatorPage-Bx-iamx_.js": "3b4268fa07113dcdf7fb7572f2ed8bba09bca596bb9cc7be1ac0988260d490d9",
+ "lib/meshchatx/public/assets/TranslatorPage-BxiE4CTi.js": "88db0f1398eec72b401b07b94434d09bf56767ff3823d15f8e99a550d6f07658",
+ "lib/meshchatx/public/assets/TranslatorPage-C1MrKE6r.js": "beb6a5f7ed42c0662044de209efd6e6d1a026e6c7d7e4cc46854ce1d1376bbfd",
+ "lib/meshchatx/public/assets/TranslatorPage-C2D0qvec.js": "3f321eaf12c7981a6944df496dd8ce427e0680e758441093ca24a8c8f8633fc6",
+ "lib/meshchatx/public/assets/TranslatorPage-CQs4_NoK.js": "a8d8838e74d631444196a11291a7299e4a75d378476510c46a294330d7620ac7",
+ "lib/meshchatx/public/assets/TranslatorPage-CZ__7xGT.js": "7f765bf40e4a2c0382a8806142e67a1255a164fea3a3c124a498eaa584320964",
+ "lib/meshchatx/public/assets/TranslatorPage-D0lqy7LK.js": "e24560834361754885f6e9b6b07233adc076bf109e769fb4a397ee857dd77078",
+ "lib/meshchatx/public/assets/TranslatorPage-DU0_fIZo.js": "a0127d8ace8a56e1f5de1a844b40f100f6342258ea5c729147e6ce18db7ad9cd",
+ "lib/meshchatx/public/assets/TranslatorPage-DYyPNK-E.js": "d38688427bdfabf261aaec97d5ae5323434887147869018e818abca639529d37",
+ "lib/meshchatx/public/assets/TranslatorPage-DdhsGqd-.js": "2d3628cc34aabe5c667396046c96c61e3a53736745dc8f39f6cba38d09c55a6d",
+ "lib/meshchatx/public/assets/TranslatorPage-Die2Kti8.js": "9b0d0a594e2b147a2fe1430cda8770d26e463ef2211644be2f93ee22e4609e2d",
+ "lib/meshchatx/public/assets/TranslatorPage-DiyAD1yE.js": "d780a4aff40db62a2c57859c87f6b48b01b78c23e4b23c46488740cb1dbc06f1",
+ "lib/meshchatx/public/assets/TranslatorPage-Dnyns-3_.js": "ceedc57a5251f582c21abb8848cbe032daeac2de2b94e589ca63117ae6834537",
+ "lib/meshchatx/public/assets/TranslatorPage-Dvv62_Nt.js": "fda3d637c566626f81a0e0a7b35d82b3cdfb3d1d7536ee8725a1112411b35358",
+ "lib/meshchatx/public/assets/TranslatorPage-Dz54TokK.js": "e825e1ab1b1bd1ed7cac4412a89841765aad1a70079b63c614a1c8b816ce306c",
+ "lib/meshchatx/public/assets/TranslatorPage-r2ceAdNq.js": "832a2bb19c517aa4915101213d375b0891ebbfd7cb1163ee896702938183d2a5",
+ "lib/meshchatx/public/assets/app-2fy0ix7T.css": "601334eab816b5d14c18632e689131acf4b5a36b223e63c5bf123acbae866d2f",
+ "lib/meshchatx/public/assets/app-B6j1Aqua.js": "6c5e9758d44fc3096cdf20bb16d82a4e9ac04f83faa3dcd1793cc55824040ce6",
+ "lib/meshchatx/public/assets/app-B8CKyts2.js": "c3ed5f12accc876c7f3597eff1ed212eb501fe8e73832b9715e4cd0a388e9a23",
+ "lib/meshchatx/public/assets/app-BHB7Vsxd.js": "5831bb7c937c5bfc9597032a522f4952f9730f64e11c956e5be4bbb793d55a9a",
+ "lib/meshchatx/public/assets/app-BOBXDFxj.js": "20b7aef1b45421bc64a7c8a8c1e32ae6e32c831a28dedc051c5ff5861aa84b52",
+ "lib/meshchatx/public/assets/app-BXuILOrd.css": "9fbdfe449e583ed793c389fbaea80ad69b0a3f38025cbb4c1109eefc8819950a",
+ "lib/meshchatx/public/assets/app-BaDr5OMd.js": "ca195a3822dbaaee8442308144826a57d2ee81d8d73d93aa5f9923c421bb79de",
+ "lib/meshchatx/public/assets/app-BbDj6Q8X.js": "ce7025732322005c795d7202dfcf52a9cd4ce143149969cc1073d41fe6381a3a",
+ "lib/meshchatx/public/assets/app-BbY1SChk.js": "dfc0594a5d3142b9220853d26bbf19803ab5d0721001b4f42f47131dd40f7190",
+ "lib/meshchatx/public/assets/app-BmpTRjdT.js": "c2af7991c823b38c43d1e91bc824e1b984f76aa38b1c636326b19e1d96378726",
+ "lib/meshchatx/public/assets/app-Bohj3HPH.js": "439c99979819fe2f65c621b8b8bae00fef9f6dacb520fbcf2acf5685f290a87a",
+ "lib/meshchatx/public/assets/app-C4nDn0Na.js": "77d4d6975479c3fb608238b69b0abc50f1a46eec980a0c1be53d9622bd2d4a8d",
+ "lib/meshchatx/public/assets/app-CE3Hv6a6.js": "81aca058b7bd320fca3b65d92e5a7c5e6e851318fcaa854cbe712cdf1b670696",
+ "lib/meshchatx/public/assets/app-CTRkibwF.css": "b8f7a7d52f31af48e35ca0c2a8670edd64c4f28361b4eb412a00f28597221e90",
+ "lib/meshchatx/public/assets/app-CTqOzAzO.js": "6aa9e4f4366a4769220f697be7dac38146d645658190e33c7145bee4bfb98e02",
+ "lib/meshchatx/public/assets/app-Cj_1FtQw.css": "cf2e01aaf6fad80d752baf7a3f07d4d7dc08ea4d38316f341d5634e1c952c926",
+ "lib/meshchatx/public/assets/app-CnWI1kjY.js": "890f181a79455eabdbf26cc9ca4eab34ea3091da92ad3b905de8297c9a8f0e7d",
+ "lib/meshchatx/public/assets/app-CwKr_yxB.css": "caeb23a9c6bf10c22b8d156e1d96dbc3e72d18ee76ac37be9885831cd62868ab",
+ "lib/meshchatx/public/assets/app-DTD_JJvV.css": "8f549a4267d38e01ba9af00e4287bc93b9516e68aae18819f6bc5ea1d509bab9",
+ "lib/meshchatx/public/assets/app-DTNPJDnD.css": "795b62ed84ce576bf737e9e43276b4a09fd7087233abfdb6b50bf33a8c46b011",
+ "lib/meshchatx/public/assets/app-DjEvJFWn.js": "9b78392a3df0b616fa569cab8f441a338573e9a028471405892ba0368014d56e",
+ "lib/meshchatx/public/assets/app-DsETXe-k.js": "b935ea6a5c9ed4cf93c1128812803ba272a2d4d77eb857631a949f35e6fb0ead",
+ "lib/meshchatx/public/assets/app-OYNH2PgU.js": "0888811e513a882dc4259a6b94fa29279d95c68bb258a975583cadeb312f55a4",
+ "lib/meshchatx/public/assets/app-QAFEbTCA.js": "9c9e9e3313b36c9e03aadb705c21fae67d232290218796a00419bbde748e27e3",
+ "lib/meshchatx/public/assets/app-RFBX_G6w.js": "63bd0ea6fab70f05d4801aa7b95c3461246c3ecf20d5fe4a7da34ad664a33b96",
+ "lib/meshchatx/public/assets/app-_GNIkRr2.js": "1351b5f5973f2b41a814d2e938eeca2581313a247463a3fd76c5686d635a46e7",
+ "lib/meshchatx/public/assets/app-zuyAIlIs.js": "a7c41ab6e15ea121781a8b7da09c33a67431219a2253ba78dabb588739aec470",
+ "lib/meshchatx/public/assets/images/logo-chat-bubble.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "lib/meshchatx/public/assets/images/logo.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "lib/meshchatx/public/assets/images/network-visualiser/interface_connected.png": "a6f2e0a1efb5949789bc47a15922e3d2f443d51cee30b984b50d7576a5e95e7f",
+ "lib/meshchatx/public/assets/images/network-visualiser/interface_disconnected.png": "948f78f1957ffa821114bd18d4cf13986c65269055eedd106be252b44274fd9a",
+ "lib/meshchatx/public/assets/images/network-visualiser/server.png": "9f995a1dbb06232d71be176267199439b923d5898e076c890dea01b6a9b16535",
+ "lib/meshchatx/public/assets/images/network-visualiser/server_1hop.png": "7a3ad9dbe673dd2ef8a5b7d90ac9c276d436d8b1d16bb69f8ce84e40f5bcfb92",
+ "lib/meshchatx/public/assets/images/network-visualiser/user.png": "bcad4e7a6bcde488199f23e9fd6c60a6fd928c05f079175499785c5636f13796",
+ "lib/meshchatx/public/assets/images/network-visualiser/user_1hop.png": "91aa213e0d7d8ae55c5d89c79e77cc37ff3bc5d405876af91cb70ea1ac16cd2a",
+ "lib/meshchatx/public/assets/images/reticulum_logo_512.png": "035f499a1619cfb6d2da2ca99539e9e9d122bb18addf2ab83d3413592e7662f9",
+ "lib/meshchatx/public/assets/js/codec2-emscripten/c2dec.js": "5771ab23ccd1fc7c99b1b9a257461951454918dad23ecd8b549c651540cc078d",
+ "lib/meshchatx/public/assets/js/codec2-emscripten/c2dec.wasm": "24f8611ba983641ee3582f1ad12163697b582134308bba2449eec1ae30935547",
+ "lib/meshchatx/public/assets/js/codec2-emscripten/c2enc.js": "e7b155ab6333b71ec2fabe32a55fc443db167be7491c27bb68948388c162d402",
+ "lib/meshchatx/public/assets/js/codec2-emscripten/c2enc.wasm": "4cf5e44036256236b5f440bc6dfd338d9d049a242a3bb90756dac68a43b31efd",
+ "lib/meshchatx/public/assets/js/codec2-emscripten/codec2-lib.js": "9d0a78ea1db26314d34dbd09921d625df866ae47cd8db511b0bbb2e78f0e950e",
+ "lib/meshchatx/public/assets/js/codec2-emscripten/codec2-microphone-recorder.js": "b7bd6721b30881f1c3ec8d6461e15d6bba94a8c6a4eac6be0dc8214a3b0863b3",
+ "lib/meshchatx/public/assets/js/codec2-emscripten/index.html": "67b3a8c8777f87a5bd9383ad188e6fb5025c6131628b354d8c0c0ebfae6175b7",
+ "lib/meshchatx/public/assets/js/codec2-emscripten/processor.js": "efe9a88a4b1ba8ad72373480e976b496632097d0344997bcf4b93d5e7c7b6bd9",
+ "lib/meshchatx/public/assets/js/codec2-emscripten/sox.js": "e1c13c18a90e7b1518f0830cf1d2b263856f2276381278eb78afe25b28814a70",
+ "lib/meshchatx/public/assets/js/codec2-emscripten/sox.wasm": "eab8957398b7df78550e5d74bdbe38dd232ad5e6d68fc874daa78a9ed669753e",
+ "lib/meshchatx/public/assets/js/codec2-emscripten/wav-encoder.js": "dfeec66f1ffeda1b783d240afa85141c77df3e5e6bfb0f12caa89c586c3e6b18",
+ "lib/meshchatx/public/assets/js/tailwindcss/tailwind-v3.4.3-forms-v0.5.7.js": "1829e78dfbc21c0929c4fc257e849d054dd7162f4bf2a5f5676617fedd990e54",
+ "lib/meshchatx/public/assets/logo-DZE3PCxd.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "lib/meshchatx/public/assets/materialdesignicons-webfont-B7mPwVP_.ttf": "61e8aba5a4e981fe22cf7c8e8bcdbea00476e75c62c37f01bf7ee33361d68428",
+ "lib/meshchatx/public/assets/materialdesignicons-webfont-CSr8KVlo.eot": "0b183104d2fc5f26196e773c77bdaf2e05509fd4259d2d15ecedca79b87e84f9",
+ "lib/meshchatx/public/assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "662fefa8f2f8a95c18588d21774789c107c64e771cbe65a69af46291c4311afc",
+ "lib/meshchatx/public/assets/materialdesignicons-webfont-PXm3-2wK.woff": "a5928a0d5c2f624e46f98d9b15c2f60045377f7c594dd78a1759132ea3b463eb",
+ "lib/meshchatx/public/assets/proto/audio_call.proto": "db67d003f56bf1f8317913deeac6ecb55760c573c82f350cacfd6450da4260fa",
+ "lib/meshchatx/public/assets/vendor-axios-C1it03rL.js": "03842a2abe5c255e5e77227c5a50978b76230f5639302ad531bafe5552ee16e7",
+ "lib/meshchatx/public/assets/vendor-compressor-DH721-V_.js": "0d60c566c6074e3a14899a7eef34de5fbf100c060cdb7f91c85c17393ae2df12",
+ "lib/meshchatx/public/assets/vendor-dayjs-Bm9JdU5I.js": "0e7b1d2a8b6a9f404245fc05c44363797e8ff0a9263796c593aba3924ff15591",
+ "lib/meshchatx/public/assets/vendor-mdi-BDiqFXHQ.js": "bf220609d423893e0a456f755b3146cc5c8477891b2d5bb999fcfc8f5c61e737",
+ "lib/meshchatx/public/assets/vendor-mdi-Cx2MC6_s.js": "2e568519042465df31a18333c29eb8d32d4a935f2ed033f76c8eb147bea222f3",
+ "lib/meshchatx/public/assets/vendor-micron-BSEEgE84.js": "a66dee6052d9e0008f7295d581178addecb939553f72f536bf5b67bed87285fd",
+ "lib/meshchatx/public/assets/vendor-micron-DU_TH2sZ.js": "1b0bf55b194ec42669c46d877185f82ec71d88dbb878ba93381c42db0a8adf7d",
+ "lib/meshchatx/public/assets/vendor-mitt-BHPWSuhB.js": "ed25e2504b52c9fe7e4ddd6942bbcf1963d347dd112bec223f25666dfd8b6845",
+ "lib/meshchatx/public/assets/vendor-other-BjIYm04z.css": "cfce4b37252781143ea9b1c6bdbdb1348e0b77194ec89ccc19a5e00d2d365e2f",
+ "lib/meshchatx/public/assets/vendor-other-BtPCEgEn.css": "7f80cd941e5d83568410726dadb7f2a05e47fd819961b76c744b88cbb64d0519",
+ "lib/meshchatx/public/assets/vendor-other-C0noCZhC.js": "cca9b42fdf038917f8866c1f9d4750081d5f402bd2042b61346190da94b3bf35",
+ "lib/meshchatx/public/assets/vendor-other-DktJSGWy.js": "cca9b42fdf038917f8866c1f9d4750081d5f402bd2042b61346190da94b3bf35",
+ "lib/meshchatx/public/assets/vendor-vis-CfGaKk2g.css": "29ca7c5984322088d17495b1e842dc3b612893a0d07b3d004a00dc3a37c23be9",
+ "lib/meshchatx/public/assets/vendor-vis-DW7fmx29.js": "9e93cc024f5ff1bcc50a5cd2a71ba6184258109d7160aee1e9fb66ae5941ca3e",
+ "lib/meshchatx/public/assets/vendor-vue-DpQ2LQiZ.js": "887b6b1c046857e64597df74c7845578798ade35dacdfa88ecb569b20debeb93",
+ "lib/meshchatx/public/assets/vendor-vue-XbqVpb8f.js": "ac54e340d86d33d265fd8a3f3e3c64334ec3dd50106506c100defbaa80a9dc81",
+ "lib/meshchatx/public/assets/vendor-vue-router-B-dvAhom.js": "38550e69ae685e1d9f5c405ce019b70a808d84bfb2a6ae46ac93a18a2aa44a9d",
+ "lib/meshchatx/public/assets/vendor-vue-router-DNECaeJa.js": "8f40faea305bdf48a74b198e2a4cf57aad2584d27c649926908092dfe3346614",
+ "lib/meshchatx/public/assets/vendor-vuetify-BLqNJyZz.js": "ab7479f05c00ded360c0dabb266e57a260385782ee1db27973907892400b8793",
+ "lib/meshchatx/public/assets/vendor-vuetify-CZPGfs0P.js": "65924b51d3aa97e6b2b6c2537a6de5e03d5c502cfd6a32a763efe3f4090539a5",
+ "lib/meshchatx/public/assets/vendor-vuetify-Pi5piU4G.css": "3bfdb31e32b3a58f3d73a72709fa746a49b5080afdb80e6312d142bbc2d1b3e6",
+ "lib/meshchatx/public/favicons/favicon-512x512.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "lib/meshchatx/public/index.html": "12b6b63d5bb8164a855a6166e742792db319a3e26ec32ff91f2c277ebc4b3874",
+ "lib/meshchatx/public/manifest.json": "3087f201e01ba1e4783999433b9cbd34071a634f737b932c288bd2b0bbba405a",
+ "lib/meshchatx/public/meshchatx-docs/meshchat_on_android_with_termux.md": "66b5ddd5611a5bde02072e6e3ec4a6af01c7baaba90531b2d3e385ea5ad58a70",
+ "lib/meshchatx/public/meshchatx-docs/meshchat_on_docker.md": "6c0f0874d08188435d694f0d73114485cbebcfa16459e4c52ecd3f86b794fc4d",
+ "lib/meshchatx/public/meshchatx-docs/meshchat_on_raspberry_pi.md": "6a9db4284c00ea2e0443bdab124e256d3daf89489482141ed124c8115a62e360",
+ "lib/meshchatx/public/rnode-flasher/LICENSE": "4e590a1cbb467d60c6c55ca547dc71517955098d13d5483e3d9191fc03af44df",
+ "lib/meshchatx/public/rnode-flasher/README.md": "d453c7d31a69ff39fea6d096cba10fb8025a3eeef9c17e310ff38ce60adf311f",
+ "lib/meshchatx/public/rnode-flasher/index.html": "496fbd47d8879846812ba1e8895d3ea2451dc7686b374f3a47e4420b2f915865",
+ "lib/meshchatx/public/rnode-flasher/js/crypto-js@3.9.1-1/core.js": "4c350747271d3901045e9f6939ec2f0edd40dc6140bec6b8e540b66d80310b86",
+ "lib/meshchatx/public/rnode-flasher/js/crypto-js@3.9.1-1/md5.js": "1d7f30238bedb8d3016abb0f4096480d960e1d1668720668d47dd39f80f24a48",
+ "lib/meshchatx/public/rnode-flasher/js/esptool-js@0.4.5/bundle.js": "6320195516fa7974926025e3f33d0fd4a18cab3e1cf26526b9e2c079007176b0",
+ "lib/meshchatx/public/rnode-flasher/js/nrf52_dfu_flasher.js": "f7f48c88357dae487d724cbb735af12a93b0843aa75183d1dfd51b4be82c6f54",
+ "lib/meshchatx/public/rnode-flasher/js/rnode.js": "31583723b56724d3485873d49a8eb4abe07587462f700dd25a2f9eae02ab4f22",
+ "lib/meshchatx/public/rnode-flasher/js/tailwindcss/tailwind-v3.4.3-forms-v0.5.7.js": "1829e78dfbc21c0929c4fc257e849d054dd7162f4bf2a5f5676617fedd990e54",
+ "lib/meshchatx/public/rnode-flasher/js/vue@3.4.26/dist/vue.global.js": "c71ec2d9f47acae53c0202acbf771c1e06e13943708c8e7a4ef76f733b91e2b5",
+ "lib/meshchatx/public/rnode-flasher/js/web-serial-polyfill@1.0.15/dist/serial.js": "739e8a556a1453c87a619b2520dcbda39f0cea55c5d0bf865bc5967e7e4fcad0",
+ "lib/meshchatx/public/rnode-flasher/js/zip.min.js": "4435d44e680530b0965c7219227f14601f56fd703a27dc7844c1b78fa4501b76",
+ "lib/meshchatx/public/rnode-flasher/reticulum_logo_512.png": "035f499a1619cfb6d2da2ca99539e9e9d122bb18addf2ab83d3413592e7662f9",
+ "lib/meshchatx/public/service-worker.js": "33d3c60e6a84f1e43ffdb03a32a96d8d87e716f9dbf3828896810c91cc694d5c",
+ "lib/meshchatx/src/__init__.pyc": "548cf869efb387ec82427694cde124406c0d31bd0989ccf0fc56a88f1a968c1c",
+ "lib/meshchatx/src/backend/__init__.pyc": "507bf7619277ba811a3dd78982ecc9f00467e5764bd6b5e769edca293611fe16",
+ "lib/meshchatx/src/backend/announce_handler.pyc": "6393ea2caa12d638572b04401bd7ad9517980c5605b6b318206fac65abd06c08",
+ "lib/meshchatx/src/backend/announce_manager.pyc": "027c538008ef992013fd0fa61b0bcf70b48c0a62bed981a5aa1768a86fda6e68",
+ "lib/meshchatx/src/backend/archiver_manager.pyc": "a76c9d8d7cc82f57cc8ee84b8fc1602a014e8fc3c0283a766c7eb757ceeafbc5",
+ "lib/meshchatx/src/backend/async_utils.pyc": "0a6fa463e03f024d27072061975a1bcf9b793634f6fb2005da7b101f9c118caf",
+ "lib/meshchatx/src/backend/colour_utils.pyc": "6c93816c445b4d17b94563a6525e8f8272f2d9ae57d8daa8a33aa3c711a267ef",
+ "lib/meshchatx/src/backend/community_interfaces.pyc": "a3dcbd3c1f6a6b8502ab8754dcbc096dab2b1655c18b86247bae4dbde43bbd12",
+ "lib/meshchatx/src/backend/config_manager.pyc": "10a620bab746168831b7fc19cdf636cedc9b6557d0f4c13a83f508a5b238663e",
+ "lib/meshchatx/src/backend/database/__init__.pyc": "2865f72f20cb5ba0a766e9377dbf9527fa9386775044a810bf3b51be86f6cffc",
+ "lib/meshchatx/src/backend/database/announces.pyc": "4c9249b37537bb9aae510534cd8c85b58dd1b4ee962126a2ec9dd91d0d164c78",
+ "lib/meshchatx/src/backend/database/config.pyc": "dbfe1babe8fd4b3455a872b2cdcab7304a026d964ece9f25209a688ec0c86a42",
+ "lib/meshchatx/src/backend/database/contacts.pyc": "50f5f0df140b33b72d6011a48107847a9057fd7839c48fc3c8df8c82c96e013e",
+ "lib/meshchatx/src/backend/database/debug_logs.pyc": "85b2a05da6059a74d568aa6f82b6434cfdd4cba898d2573d3d65ca133fd6b34a",
+ "lib/meshchatx/src/backend/database/legacy_migrator.pyc": "3c954566fe8581aebf929cc39a556332ec66a20ae4edbf206a84ddc75514ab1d",
+ "lib/meshchatx/src/backend/database/map_drawings.pyc": "df2b602fb83be5352bd9baee4500a1b39251b1ecd6fdf8ca39b758feb476c052",
+ "lib/meshchatx/src/backend/database/messages.pyc": "3f15d622494b7ed3342a8e7ec22916a018a02662e76cd63cdf58c429be5af574",
+ "lib/meshchatx/src/backend/database/misc.pyc": "7523f99a18083fb586099c7e5e36dfc1965e0bd595fbc6597ff759b6c270946c",
+ "lib/meshchatx/src/backend/database/provider.pyc": "3e74be8357e9dc1bf9c2e8f5d76f53abef939e320f41d99117ec5f2e97159a36",
+ "lib/meshchatx/src/backend/database/ringtones.pyc": "3b6e7582a285ea9d7e1ec249c2db5e85d6d0e31dc7a30ff141768205df7c3fee",
+ "lib/meshchatx/src/backend/database/schema.pyc": "78c237c92bf4bed5b52aedc2ebeeda27767ce44741bc1e3fc6a7e51ea3578d85",
+ "lib/meshchatx/src/backend/database/telemetry.pyc": "0bc61db825a8fe7623ac127d265427a8baf46ee87cd289c1f624dba53ea71990",
+ "lib/meshchatx/src/backend/database/telephone.pyc": "5437b99b383829c12dddfce695a5f8131e7c5b1158c498da70de6bf3000bd8a9",
+ "lib/meshchatx/src/backend/database/voicemails.pyc": "097725b79122d6eda1780edaab304f262cc42d00bc21662e86d9ed399639bd64",
+ "lib/meshchatx/src/backend/docs_manager.pyc": "c9578e2d30a815461463c1e81db9644ec50d711bfb806cde71deefd43c725eb0",
+ "lib/meshchatx/src/backend/forwarding_manager.pyc": "193677db7f9041cfa2c397771886dd62660f0c5db8cf755e554ceeac06af0d75",
+ "lib/meshchatx/src/backend/identity_context.pyc": "3b16675289df3612498a23dd73d9cdbd02035ceb8b3aca05f0a785e92011265f",
+ "lib/meshchatx/src/backend/identity_manager.pyc": "2dd602c97ffb381ebf450bd3f40ccb1175e682afe53aabaa0c53a3ffdfdc9d17",
+ "lib/meshchatx/src/backend/integrity_manager.pyc": "dbec84e46380dbeb3f79bf6a0a529e8446856b2b229197c22f869d86da443e49",
+ "lib/meshchatx/src/backend/interface_config_parser.pyc": "e2bfe1ee32c0ece0e91fc96a22c913118fca57ca1582e918bd4a4b7b717547e9",
+ "lib/meshchatx/src/backend/interface_editor.pyc": "6c7815bd22b739b88a69c2d14471746aa0ef27b7a44cab6ed143fca4e0640097",
+ "lib/meshchatx/src/backend/lxmf_message_fields.pyc": "cb0718617356cf00f506e197abd4ba9463f0fbc4d94e165cc9bbe17e9f9a2a30",
+ "lib/meshchatx/src/backend/lxmf_utils.pyc": "dbf148a99751e7528f3f5a95898097988730bfbd85271d4e4cd64d5e248a5503",
+ "lib/meshchatx/src/backend/map_manager.pyc": "640685d59cf2fa4ecd34d9a33674f04dbf03be1373bd362e99ed0eb476378c19",
+ "lib/meshchatx/src/backend/markdown_renderer.pyc": "ee12384ca0b896cae85c6c3b59620ffe4d79aaf1826d72210a4e6b5d488c6a8a",
+ "lib/meshchatx/src/backend/meshchat_utils.pyc": "cf0561ce6a93169f1bb6be4219f12ed8ee9ced2c0d6b81e89196ba9c8129dac5",
+ "lib/meshchatx/src/backend/message_handler.pyc": "fb7f583f30d5d192ac9794ec09ba94aa919ab759f007998d0120a2ae6c52a373",
+ "lib/meshchatx/src/backend/nomadnet_downloader.pyc": "8f5765e7c0aafe0a09370bf8c03a49770aae1062ff57f3618291f256f9aebc39",
+ "lib/meshchatx/src/backend/nomadnet_utils.pyc": "6841de9233a3595cc8c36e59a10e5a9ebc8bfae8a301d3e48b7ffc723dc4fe76",
+ "lib/meshchatx/src/backend/persistent_log_handler.pyc": "6f7d6e99b969bbfffa8c857847c4da7433daaa564da1e422b61a79b4eb6ff0b4",
+ "lib/meshchatx/src/backend/recovery/__init__.pyc": "403990bfb6fe62d5665b7b671bdce8911f91d3e85c359d8435e3797be9fd4308",
+ "lib/meshchatx/src/backend/recovery/crash_recovery.pyc": "d1032bbd517442066ef2e3c056a0b42cc4a7aa103501178638d307cb10044a6f",
+ "lib/meshchatx/src/backend/ringtone_manager.pyc": "722963182fc03b82e2db13b4b6563cd5625aca84fd653466884c3777f1338033",
+ "lib/meshchatx/src/backend/rncp_handler.pyc": "9aa633a9f0ae68afd8b2b7e5e80bc3ce02c2521f1692f59a53506141d17ca7b6",
+ "lib/meshchatx/src/backend/rnprobe_handler.pyc": "484fc5dbce4081f965c28763487cb837bc1136c307bf7d8db1ef8a931dcb6edd",
+ "lib/meshchatx/src/backend/rnstatus_handler.pyc": "9075aad102ac2a891f818ffa7bb4a4ac5bc4bc7414bff411960bac92076e28f8",
+ "lib/meshchatx/src/backend/sideband_commands.pyc": "cda2579da628302e4fea04b775a9dcf30097913f4d6768cc200162c548a83ea3",
+ "lib/meshchatx/src/backend/telemetry_utils.pyc": "716e8a0021c804a477d2f18d01461881d92c8b9c095a605be32988748df52c16",
+ "lib/meshchatx/src/backend/telephone_manager.pyc": "76d36ebbf58b1829497eb0ba6b4a9fccca6a35500715837a897837c4caad0709",
+ "lib/meshchatx/src/backend/translator_handler.pyc": "6ea736f420e08e70e02e809d2556ca728d8976c41177cb5e0b7f3a41cc2802c2",
+ "lib/meshchatx/src/backend/voicemail_manager.pyc": "6c1bfeeecb8fd5e25020268e7aa3384dcd4cdf592a67a8025390cd4a4382a43a",
+ "lib/meshchatx/src/frontend/assets/images/logo.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "lib/meshchatx/src/frontend/components/App.vue": "4a12991a470a01db7921e95fbbe11e0ac1673000e02a072e059f423929f40ff4",
+ "lib/meshchatx/src/frontend/components/CardStack.vue": "4720185d7eede95fcf979c8be6a4e2d9c6aeabdc860e7ed58b8d6eaaf105a74f",
+ "lib/meshchatx/src/frontend/components/ChangelogModal.vue": "8f748c8d918b8f454f438d6dc5d1b6970af7b1d7dfb3325706495af0d0019df6",
+ "lib/meshchatx/src/frontend/components/ColourPickerDropdown.vue": "8d9d0184ec2189c9f7fc75e38b55cd04116fb263929e1d7e9b381557f8417eb2",
+ "lib/meshchatx/src/frontend/components/CommandPalette.vue": "3f0b4422e49b1164275af29a2a29dd67a0791c7e82d0f400b82cc882cbcde71f",
+ "lib/meshchatx/src/frontend/components/ConfirmDialog.vue": "cc6d9737f8f37a9d7c138f25f7060895f38299905e9af541a2c283e1eaf8a4bc",
+ "lib/meshchatx/src/frontend/components/DropDownMenu.vue": "27ece7df482e4818b20689536841df25cb86a311785cec9eb9193dc884f98bd8",
+ "lib/meshchatx/src/frontend/components/DropDownMenuItem.vue": "0bb9626bdf3526da75cd5b69c46e924df14cdeaf9ea7890141e1447a9d2c1af3",
+ "lib/meshchatx/src/frontend/components/IconButton.vue": "ac62e58b859e87eb7eb95e07356d52c4bd4531950bce15aaefa5765ff571cbd5",
+ "lib/meshchatx/src/frontend/components/IntegrityWarningModal.vue": "a74a010f3e550c78027cdc15ff946c0ad1e23174a56ec110927b50667829f1f3",
+ "lib/meshchatx/src/frontend/components/LanguageSelector.vue": "830ba9144d9f97717b221b1fadec82624faf864755d3a1981a1cc54c600ba649",
+ "lib/meshchatx/src/frontend/components/LxmfUserIcon.vue": "6d5f4fcf638394b1fe8fd9f24f9691f0a6da2915e776b235321542b7d9a4c3e5",
+ "lib/meshchatx/src/frontend/components/MaterialDesignIcon.vue": "cbed9a408df8b63f19b69422c715696e93d22a9fa6570c48dc34f95a081cd91d",
+ "lib/meshchatx/src/frontend/components/NotificationBell.vue": "e2b5a0c30cf6cdec8724257ff99be9794fdb312f9f3c358ae7f09a49811b8126",
+ "lib/meshchatx/src/frontend/components/SidebarLink.vue": "a8b34d24e9c8c562b8e49c60d27c5137d3774c313abcc0633796c7c9a07873bb",
+ "lib/meshchatx/src/frontend/components/Toast.vue": "5b181e9b7f11b695f157af1bafbc3f05e4b97841d2e28a67799e286b2bcb964d",
+ "lib/meshchatx/src/frontend/components/TutorialModal.vue": "5f6c28c67ab4a0bb68c529a00ec46111d7bcfec831644372ca6e8c00cbc33941",
+ "lib/meshchatx/src/frontend/components/about/AboutPage.vue": "07d5cc7287c0c612633520c7aeb57240b024c288979cd55b7d1ef4243ebb40e7",
+ "lib/meshchatx/src/frontend/components/archives/ArchiveSidebar.vue": "08699f2ff9b3892c08c091c43a8ea520be0e6a7f4ce56c3b814d85df16bf1e8f",
+ "lib/meshchatx/src/frontend/components/archives/ArchivesPage.vue": "88cbf111ad0b96c743b1cd12ade91cb31e07ad55d6d2af6619d1b201745ff330",
+ "lib/meshchatx/src/frontend/components/auth/AuthPage.vue": "630b273a65b2d785feeb226a239c8fbfc2b4cf1d853485fc874eec55a86afc38",
+ "lib/meshchatx/src/frontend/components/blocked/BlockedPage.vue": "d03e92421b4136650435d322b91015046686dc9823afe5db4659136860fb8f53",
+ "lib/meshchatx/src/frontend/components/call/CallOverlay.vue": "b75ba5867920641d6db75eb539d7117355222f8dd883ea84c264779e8a623277",
+ "lib/meshchatx/src/frontend/components/call/CallPage.vue": "3b0d61eb1633437304b9fecf6999f7f3fae2d2b398180a29b77565882b8a43c5",
+ "lib/meshchatx/src/frontend/components/call/RingtoneEditor.vue": "0ab7cbc582dd4895b31e90ee2191867bda71c8b22809a7fd7a07c52c0a608c1f",
+ "lib/meshchatx/src/frontend/components/call/RingtoneEditorModal.vue": "77130ef44a3e0b3425549849159395210da5fb30b9ea77176d61d5436131e7bd",
+ "lib/meshchatx/src/frontend/components/debug/DebugLogsPage.vue": "3b78d0569a22a2828dbd64c716f7bccbc7f1690ff4f489061e5ea6cc2a3bfaa4",
+ "lib/meshchatx/src/frontend/components/docs/DocsPage.vue": "594a0592dbb37003247e92dae4eee8b024732dad6a7e3496a1461f2bc1e7a671",
+ "lib/meshchatx/src/frontend/components/forms/FormLabel.vue": "bbf96a72e6c24ce3117231127a0f5c1cc7602c4b07253d33b30c2d06d8d82d90",
+ "lib/meshchatx/src/frontend/components/forms/FormSubLabel.vue": "f51888a11726cdc4442f142b80920f2848c77a3d45e810e6b107fa7fee22195f",
+ "lib/meshchatx/src/frontend/components/forms/Toggle.vue": "4b392284db8dd4648a7511367a314dc0b4fdc121009ebf639a2c2d9b36a28cf6",
+ "lib/meshchatx/src/frontend/components/forwarder/ForwarderPage.vue": "2a27545221c407e6b9a131230437a141a7eaa66bc0337e52de89c316b9510637",
+ "lib/meshchatx/src/frontend/components/interfaces/AddInterfacePage.vue": "35d9defcc49f9024d399b1391e059947600018a1145ddad5e60bd217f330afb9",
+ "lib/meshchatx/src/frontend/components/interfaces/ExpandingSection.vue": "7700e5b0e524ab58666121ac24fc64826aae2fb8a8dd5c4961f82e21455755ac",
+ "lib/meshchatx/src/frontend/components/interfaces/ImportInterfacesModal.vue": "7cfe8d5c1d8c5dd615a3302c0d4f04d05dac24f55e4a83e9b804b842dfcaf7ac",
+ "lib/meshchatx/src/frontend/components/interfaces/Interface.vue": "bb79a0caae492867c4a6266b83901804949dc620ff9401fb6c0bbc0e5bb1928c",
+ "lib/meshchatx/src/frontend/components/interfaces/InterfacesPage.vue": "3066b6877b90fcc54c33c07b2576cbfc200618999cb71c0ff2333569d91e90e7",
+ "lib/meshchatx/src/frontend/components/map/MapPage.vue": "9cd1e7b9b2a9276ff19cc96626e0bf28dc3efca021cdf828bcc0d8d5c9df832f",
+ "lib/meshchatx/src/frontend/components/messages/AddAudioButton.vue": "b44bbbf529ffd7e4e4482254af6a03bde7f255f8bee18aa4ad4a9835f79e10e8",
+ "lib/meshchatx/src/frontend/components/messages/AddImageButton.vue": "47aae1ab30b74ddaf802e8a2e69797e4c1fa38bfec724eed04cf96abff86e007",
+ "lib/meshchatx/src/frontend/components/messages/AudioWaveformPlayer.vue": "a0e8c55e874f310957a54b4e059b7ae731f3e094b1c5bf2457a067880f1bc399",
+ "lib/meshchatx/src/frontend/components/messages/ConversationDropDownMenu.vue": "5d163651f79c802ecb3b29ef5972748ca26c0ef1c73bda6d4b7c70a00e488c4a",
+ "lib/meshchatx/src/frontend/components/messages/ConversationViewer.vue": "60c115098f6d81250215178cf496e7e988a4488869b99af15a2c444263a32011",
+ "lib/meshchatx/src/frontend/components/messages/MessagesPage.vue": "99f8b6a7c9f221e4fe139c5dd21cc273d896541aa9f7a551db218f5ce6b9fd04",
+ "lib/meshchatx/src/frontend/components/messages/MessagesSidebar.vue": "8634548f882dd9fd08f8688aae47589f90b669607436111b7dc0d1d304682d18",
+ "lib/meshchatx/src/frontend/components/messages/PaperMessageModal.vue": "4c4542048f2a93c4b14f567b6d1ccde2cabca03d8db1481368dcfcb1a895d17f",
+ "lib/meshchatx/src/frontend/components/messages/SendMessageButton.vue": "f6bb6c1ea4de624daf1db288b469f1f1a6fa13cf6a51a08eabae63ca0e8e8f71",
+ "lib/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue": "e71ba834937de67f53c884e7b3d46d44f8be165c50b6747f628a442c40f9b810",
+ "lib/meshchatx/src/frontend/components/network-visualiser/NetworkVisualiser.vue": "854ce8a507709de13fa16a3d41c9b5a002d3c1b024070d4d2a710a2c5bd82e43",
+ "lib/meshchatx/src/frontend/components/network-visualiser/NetworkVisualiserPage.vue": "6405ee48cbbc99d557b4d635fcfb4c398d676499f7d1ecd92e785a49f0f61a6e",
+ "lib/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue": "950e1cff585e8b09d9dde76a59fbe6c658f82c27f4beb1c0c5f63b50d698c218",
+ "lib/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkSidebar.vue": "706742db682b4266481fbce12bfbef540b0f910157978e4572612b55b0fa2a59",
+ "lib/meshchatx/src/frontend/components/ping/PingPage.vue": "7ce3f8251f4b67c1e34556b8b6a98ff3a1a5aa89d99f03e157a0ec14395d13b4",
+ "lib/meshchatx/src/frontend/components/profile/ProfileIconPage.vue": "15dd6855b8ad8180d484ebd8cc0b642dd06363f7304ca47d614ba72987438420",
+ "lib/meshchatx/src/frontend/components/propagation-nodes/PropagationNodesPage.vue": "1f7fde09cd2df361a7ea2f8c8a2cb8224cb7719d07142f682810069c48f54606",
+ "lib/meshchatx/src/frontend/components/rncp/RNCPPage.vue": "5e6ac6959f228c1a8bb3181a866f84bab7636f7f0c245e2e5c7a834304c441f9",
+ "lib/meshchatx/src/frontend/components/rnprobe/RNProbePage.vue": "9bcc82d30b06dc8b78962f1927bcdc4fbb71e26a75d9df5f852b9c8838ad4099",
+ "lib/meshchatx/src/frontend/components/rnstatus/RNStatusPage.vue": "d4422707ecd8cd3bf1b524ccf712099c9a2676416911cbf197e38a5cb56f67ee",
+ "lib/meshchatx/src/frontend/components/settings/IdentitiesPage.vue": "c79d5a44121b94e726fcc699a7871ed69f2ffbd2e91d7609de885515450add20",
+ "lib/meshchatx/src/frontend/components/settings/SettingsPage.vue": "79ebf9678a761ce6a0e3a2645fbae5b00409be0d0cbfea760ff54cadf1befe2d",
+ "lib/meshchatx/src/frontend/components/settings/ShortcutRecorder.vue": "67c60b7c03c37a52219351a019a9328dfab7e9cc9d21e4b5f98f3e4c3b1721e3",
+ "lib/meshchatx/src/frontend/components/tools/PaperMessagePage.vue": "74cf5a8103614ad1f630f0dd7fe334e33b295491448ede6377f7d9c67811429c",
+ "lib/meshchatx/src/frontend/components/tools/RNodeFlasherPage.vue": "882768e87373c4ff725a8eb3e398de7cf6dc3b20f83c75e081bf14e9bfe11702",
+ "lib/meshchatx/src/frontend/components/tools/ToolsPage.vue": "6cb98e604b4e2756d6e9ce49c10c24d3de1b001670e4ef8680030cc4cb934373",
+ "lib/meshchatx/src/frontend/components/translator/TranslatorPage.vue": "cab3ed65f3d87427b93c0ef7848da4b15132af094e358e897b56875d483d0eeb",
+ "lib/meshchatx/src/frontend/fonts/RobotoMonoNerdFont/RobotoMonoNerdFont-Regular.ttf": "3357fec1cce2d30c9a547ab35f5bd1742c005ce6343096427750bdf160be0a8d",
+ "lib/meshchatx/src/frontend/fonts/RobotoMonoNerdFont/font.css": "20653f81d3484a395f14b7e3363171ae46cb7ab8893bff28887c66b38290438b",
+ "lib/meshchatx/src/frontend/index.html": "f77e799ff3ca5a01196d22d19bf03632e2a0a4ad39f54be6feaedc5b6867adc8",
+ "lib/meshchatx/src/frontend/js/Codec2Loader.js": "a30385a7eedfe600a5abbf428b32b4384f2a6c390d6679b34d3a2685b1d52aab",
+ "lib/meshchatx/src/frontend/js/DialogUtils.js": "33a97d4be2a17acb3e1bce4c5063112503dab414a03a566916ca5cf507850e42",
+ "lib/meshchatx/src/frontend/js/DownloadUtils.js": "b94edded3838a57ead6242a03a4f95b33f8af031b376988678c68e967f4668ba",
+ "lib/meshchatx/src/frontend/js/ElectronUtils.js": "2c29fe23b46992c396cd0e4d6cd646103747d44fbeccf8e30ca16f1adf3c347c",
+ "lib/meshchatx/src/frontend/js/GlobalEmitter.js": "603e355b62444d11694b13b0650c08ddf810d77cd5c0c904d83ce09d5bdb1ba0",
+ "lib/meshchatx/src/frontend/js/GlobalState.js": "ba87ecc82ff4878df187a9532f7148d8a23052b86154e047af462a7767558214",
+ "lib/meshchatx/src/frontend/js/KeyboardShortcuts.js": "099999f253c8ae161a6968b8ac9d20fedf2df05af40130d7ddb15a885b6ce753",
+ "lib/meshchatx/src/frontend/js/MicronParser.js": "bdc176d7a420fac0af00f5f008ce82450fc742584fe084ff8417377d794eab1b",
+ "lib/meshchatx/src/frontend/js/MicronStorage.js": "9eb743fb52c61e6d56c7058df80ad6f8f932bc67815974c806b65f6e1d8c7ae9",
+ "lib/meshchatx/src/frontend/js/MicrophoneRecorder.js": "c6484db2cb4651d1153cc5b1fbabb376d76b9284cdaa543a89055d8b2db556d3",
+ "lib/meshchatx/src/frontend/js/NotificationUtils.js": "4f2964c4aab14f3e23b8b5eac7239dff38df8eaaca096fec8a22551becfb5745",
+ "lib/meshchatx/src/frontend/js/TileCache.js": "60b3e89a07b7d05d520408b355b7bb99cd7351911725b95135cbbdbd59400dac",
+ "lib/meshchatx/src/frontend/js/ToastUtils.js": "6b96944dd1b0ad06466195576d71d33b3ab57e513c2e929d0ad5cd28cac7f20e",
+ "lib/meshchatx/src/frontend/js/Utils.js": "737cb98d6ac1651983c82d0a736b3cc3157f5fb5e40e9dc7c4632d52cc800b27",
+ "lib/meshchatx/src/frontend/js/WebSocketConnection.js": "019e9a8701ba5acdc03d42c1ffc7f4f5e7dc19d5167f611cd1fcd8f152dd5192",
+ "lib/meshchatx/src/frontend/locales/de.json": "deb3336e65166cce379306ff39bdb5b78d0fc22762cb82f11138b7a1ee5d85a5",
+ "lib/meshchatx/src/frontend/locales/en.json": "318eacb7337f76fc8c1b7fb1b479fd8c3ef8e128a96f75794d0d7bb82154acb9",
+ "lib/meshchatx/src/frontend/locales/ru.json": "e9aa331ec556013ccb5ae6e9bad4ee021cc5d31301d952d2c63c2bb0e6f875ee",
+ "lib/meshchatx/src/frontend/main.js": "cdffea1680a4765ae6515516e8bdc3b2ee31f837303da4064cc348f12f0bec28",
+ "lib/meshchatx/src/frontend/public/assets/images/logo-chat-bubble.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "lib/meshchatx/src/frontend/public/assets/images/logo.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "lib/meshchatx/src/frontend/public/assets/images/network-visualiser/interface_connected.png": "a6f2e0a1efb5949789bc47a15922e3d2f443d51cee30b984b50d7576a5e95e7f",
+ "lib/meshchatx/src/frontend/public/assets/images/network-visualiser/interface_disconnected.png": "948f78f1957ffa821114bd18d4cf13986c65269055eedd106be252b44274fd9a",
+ "lib/meshchatx/src/frontend/public/assets/images/network-visualiser/server.png": "9f995a1dbb06232d71be176267199439b923d5898e076c890dea01b6a9b16535",
+ "lib/meshchatx/src/frontend/public/assets/images/network-visualiser/server_1hop.png": "7a3ad9dbe673dd2ef8a5b7d90ac9c276d436d8b1d16bb69f8ce84e40f5bcfb92",
+ "lib/meshchatx/src/frontend/public/assets/images/network-visualiser/user.png": "bcad4e7a6bcde488199f23e9fd6c60a6fd928c05f079175499785c5636f13796",
+ "lib/meshchatx/src/frontend/public/assets/images/network-visualiser/user_1hop.png": "91aa213e0d7d8ae55c5d89c79e77cc37ff3bc5d405876af91cb70ea1ac16cd2a",
+ "lib/meshchatx/src/frontend/public/assets/images/reticulum_logo_512.png": "035f499a1619cfb6d2da2ca99539e9e9d122bb18addf2ab83d3413592e7662f9",
+ "lib/meshchatx/src/frontend/public/assets/js/codec2-emscripten/c2dec.js": "5771ab23ccd1fc7c99b1b9a257461951454918dad23ecd8b549c651540cc078d",
+ "lib/meshchatx/src/frontend/public/assets/js/codec2-emscripten/c2dec.wasm": "24f8611ba983641ee3582f1ad12163697b582134308bba2449eec1ae30935547",
+ "lib/meshchatx/src/frontend/public/assets/js/codec2-emscripten/c2enc.js": "e7b155ab6333b71ec2fabe32a55fc443db167be7491c27bb68948388c162d402",
+ "lib/meshchatx/src/frontend/public/assets/js/codec2-emscripten/c2enc.wasm": "4cf5e44036256236b5f440bc6dfd338d9d049a242a3bb90756dac68a43b31efd",
+ "lib/meshchatx/src/frontend/public/assets/js/codec2-emscripten/codec2-lib.js": "9d0a78ea1db26314d34dbd09921d625df866ae47cd8db511b0bbb2e78f0e950e",
+ "lib/meshchatx/src/frontend/public/assets/js/codec2-emscripten/codec2-microphone-recorder.js": "b7bd6721b30881f1c3ec8d6461e15d6bba94a8c6a4eac6be0dc8214a3b0863b3",
+ "lib/meshchatx/src/frontend/public/assets/js/codec2-emscripten/index.html": "67b3a8c8777f87a5bd9383ad188e6fb5025c6131628b354d8c0c0ebfae6175b7",
+ "lib/meshchatx/src/frontend/public/assets/js/codec2-emscripten/processor.js": "efe9a88a4b1ba8ad72373480e976b496632097d0344997bcf4b93d5e7c7b6bd9",
+ "lib/meshchatx/src/frontend/public/assets/js/codec2-emscripten/sox.js": "e1c13c18a90e7b1518f0830cf1d2b263856f2276381278eb78afe25b28814a70",
+ "lib/meshchatx/src/frontend/public/assets/js/codec2-emscripten/sox.wasm": "eab8957398b7df78550e5d74bdbe38dd232ad5e6d68fc874daa78a9ed669753e",
+ "lib/meshchatx/src/frontend/public/assets/js/codec2-emscripten/wav-encoder.js": "dfeec66f1ffeda1b783d240afa85141c77df3e5e6bfb0f12caa89c586c3e6b18",
+ "lib/meshchatx/src/frontend/public/assets/js/tailwindcss/tailwind-v3.4.3-forms-v0.5.7.js": "1829e78dfbc21c0929c4fc257e849d054dd7162f4bf2a5f5676617fedd990e54",
+ "lib/meshchatx/src/frontend/public/assets/proto/audio_call.proto": "db67d003f56bf1f8317913deeac6ecb55760c573c82f350cacfd6450da4260fa",
+ "lib/meshchatx/src/frontend/public/favicons/favicon-512x512.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "lib/meshchatx/src/frontend/public/manifest.json": "3087f201e01ba1e4783999433b9cbd34071a634f737b932c288bd2b0bbba405a",
+ "lib/meshchatx/src/frontend/public/meshchatx-docs/meshchat_on_android_with_termux.md": "66b5ddd5611a5bde02072e6e3ec4a6af01c7baaba90531b2d3e385ea5ad58a70",
+ "lib/meshchatx/src/frontend/public/meshchatx-docs/meshchat_on_docker.md": "6c0f0874d08188435d694f0d73114485cbebcfa16459e4c52ecd3f86b794fc4d",
+ "lib/meshchatx/src/frontend/public/meshchatx-docs/meshchat_on_raspberry_pi.md": "6a9db4284c00ea2e0443bdab124e256d3daf89489482141ed124c8115a62e360",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/LICENSE": "4e590a1cbb467d60c6c55ca547dc71517955098d13d5483e3d9191fc03af44df",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/README.md": "d453c7d31a69ff39fea6d096cba10fb8025a3eeef9c17e310ff38ce60adf311f",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/index.html": "496fbd47d8879846812ba1e8895d3ea2451dc7686b374f3a47e4420b2f915865",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/js/crypto-js@3.9.1-1/core.js": "4c350747271d3901045e9f6939ec2f0edd40dc6140bec6b8e540b66d80310b86",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/js/crypto-js@3.9.1-1/md5.js": "1d7f30238bedb8d3016abb0f4096480d960e1d1668720668d47dd39f80f24a48",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/js/esptool-js@0.4.5/bundle.js": "6320195516fa7974926025e3f33d0fd4a18cab3e1cf26526b9e2c079007176b0",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/js/nrf52_dfu_flasher.js": "f7f48c88357dae487d724cbb735af12a93b0843aa75183d1dfd51b4be82c6f54",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/js/rnode.js": "31583723b56724d3485873d49a8eb4abe07587462f700dd25a2f9eae02ab4f22",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/js/tailwindcss/tailwind-v3.4.3-forms-v0.5.7.js": "1829e78dfbc21c0929c4fc257e849d054dd7162f4bf2a5f5676617fedd990e54",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/js/vue@3.4.26/dist/vue.global.js": "c71ec2d9f47acae53c0202acbf771c1e06e13943708c8e7a4ef76f733b91e2b5",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/js/web-serial-polyfill@1.0.15/dist/serial.js": "739e8a556a1453c87a619b2520dcbda39f0cea55c5d0bf865bc5967e7e4fcad0",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/js/zip.min.js": "4435d44e680530b0965c7219227f14601f56fd703a27dc7844c1b78fa4501b76",
+ "lib/meshchatx/src/frontend/public/rnode-flasher/reticulum_logo_512.png": "035f499a1619cfb6d2da2ca99539e9e9d122bb18addf2ab83d3413592e7662f9",
+ "lib/meshchatx/src/frontend/public/service-worker.js": "33d3c60e6a84f1e43ffdb03a32a96d8d87e716f9dbf3828896810c91cc694d5c",
+ "lib/meshchatx/src/frontend/style.css": "5ed589d77e34fe3aab454a4e8436a7052d1210e21c90b18aad0ec65de7a2ab9f",
+ "lib/meshchatx/src/version.pyc": "8c5d97068b03a391d1368a492577b349016763c81870e3cdfaa1754aaac2015e",
+ "lib/mmap.cpython-313-x86_64-linux-gnu.so": "f4f9fcf21f78389d3f1a51b6524c85a262f0b242e407e449c5ff0cca3eeb6419",
+ "lib/more_itertools/__init__.pyc": "44b1bf3d413bfa8d17976fd5b5c73f12351afe833ba5a29307e3e752ba494ba2",
+ "lib/more_itertools/more.pyc": "47991b88f0b5aff289659e7b4cc308d65a1e103c1fdb69d8e280e61865d44165",
+ "lib/more_itertools/recipes.pyc": "541b029f71dec5649fd3852ffb93a81c0bc879c82fb04f5b6016e0843444a3f7",
+ "lib/multidict/__init__.pyc": "46de020b58945d56162b2cfd50b8b6d90b20d662acc0e66b2fae8fd372c4f39f",
+ "lib/multidict/_abc.pyc": "b8343394fc90f121ce4d8d0b4bef2665baa6e6235ceb0fafa25d3260640e6ce1",
+ "lib/multidict/_compat.pyc": "a4a526264fd1e1360dc9443a18b3db840666405a6b6d429cde19b751d47e6217",
+ "lib/multidict/_multidict.cpython-313-x86_64-linux-gnu.so": "54f761d8f971f708345f94fc179e1eddb0c98844e4dc5c4b863c1f54247fe9c7",
+ "lib/multidict/_multidict_py.pyc": "c897d89351d983c614f3ebed6acc471e7989621eed3db6975c5597406271c25d",
+ "lib/multiprocessing/__init__.pyc": "4f60a82faa80d6a7ea9dd04371c7a8083c5148c32fd6ea39747d54c23743a57e",
+ "lib/multiprocessing/connection.pyc": "c40c1d0f817378821a825beb215422abea260ffffb5bed47b1819ef4a9297767",
+ "lib/multiprocessing/context.pyc": "57e83c3bebdba57c56588e7fea96e91a7147faf6dfd3b683e1eb2d4da2cbe77e",
+ "lib/multiprocessing/dummy/__init__.pyc": "0afa59eb479caaf1076534a64a679a1a78d96396dea7967ea6e82e681ee82e08",
+ "lib/multiprocessing/dummy/connection.pyc": "6e47ce2dfb51e3c5c3d4e0df8eeb66aa6b63bea7952c4ec352494cb5d8c1fa3c",
+ "lib/multiprocessing/forkserver.pyc": "1a200da1adc4758ad3003223e82126645be4c177808a02f5da90eac69466f797",
+ "lib/multiprocessing/heap.pyc": "092043bd43d530880b391073beb5ac613e59bbb8cd29702aa03b2619004e8574",
+ "lib/multiprocessing/managers.pyc": "600b6d3a8ae765552b3a06575127bf58db2ee79b5f695a53d3b0d63ed6b29052",
+ "lib/multiprocessing/pool.pyc": "c24e6601ebfcff21f8eaca47fd2929b8451dd6f70b4d96bece71298c440d3e17",
+ "lib/multiprocessing/popen_fork.pyc": "d91f31bf11761104574003334cce7242d2d70e85ec0a72a5aab73205e3ba08f4",
+ "lib/multiprocessing/popen_forkserver.pyc": "13ef85204a0be265e47e4aa3b3c2d34dcc1f6ea53cbdba174dd40e9d5ed17d6d",
+ "lib/multiprocessing/popen_spawn_posix.pyc": "23e47110f03e9cc77db71da065155d445c7fcd92860ff016c06cae9f68377d2d",
+ "lib/multiprocessing/popen_spawn_win32.pyc": "f55eb0394ee0d6e7f2ea643f5671ae7be08bf9dc188d1dcc40264d6ee6309a5c",
+ "lib/multiprocessing/process.pyc": "ebcbbb105e966ade79077f6d578b507ab9e63b4f3fe56c1788ed5d940166febe",
+ "lib/multiprocessing/queues.pyc": "363cea571ffa1c1cb1cc501102fbb46e9b7d17780cb4fe002fd75eaae73a2b7a",
+ "lib/multiprocessing/reduction.pyc": "5d957d1e08e817614e9030c8884b23175cddbf5f413a565d4f90c4bfacf0a3c2",
+ "lib/multiprocessing/resource_sharer.pyc": "81d488bdcd96fc0013f59aa11c7cd78ee27e71d1571e46d934499523cbcb7057",
+ "lib/multiprocessing/resource_tracker.pyc": "1170673fe743b00bef8e7c3afe5719f2b1f9ca76706ed6ab4277605df693eb85",
+ "lib/multiprocessing/shared_memory.pyc": "36eaa710406369599bf414db7d0ea21c2196b3d557c894c35df6e4a09e42b3d5",
+ "lib/multiprocessing/sharedctypes.pyc": "a2515364f5d27ac91e6fe024b081e759a3bacf4d629dfeda0883a9ce8dc20683",
+ "lib/multiprocessing/spawn.pyc": "402661a08098d3958ec92457d5a8665c63a0bdf60c04471841e8be4ad05f3657",
+ "lib/multiprocessing/synchronize.pyc": "a8dfc22cac40066a7982a241b02cc94a71fc21f701b625eba6cac8997d66bdcd",
+ "lib/multiprocessing/util.pyc": "38fb86c14bf815e034eafbaedb8508d04d29309732dfcff39efdc21e2834e980",
+ "lib/numpy/__config__.pyc": "82143f9e5e4e48ae605c84f3e51cbbe46b1b2b3cf2da367996f90889765d4f8f",
+ "lib/numpy/__init__.pyc": "1c89ca20d70b4224b1f08d9c7efca4646da1cda1ec364b3c559211410e57eef4",
+ "lib/numpy/_array_api_info.pyc": "55c35af6cd53f1c37b5689a8d9b21e6d97d97a4e6f5ff7b434b7164df5fe9805",
+ "lib/numpy/_core/__init__.pyc": "2761d43f96261c9a41b66fd072865546f5604cbf0945c0c05d7c301590a39879",
+ "lib/numpy/_core/_add_newdocs.pyc": "95d2fc2346f66e1d0db5c161bbdff7a5f0ef511e03d0ea31ae8259d575492d49",
+ "lib/numpy/_core/_add_newdocs_scalars.pyc": "bd9d131bb4f69263d3ec9ebbeaccff8b5de5131e6a7f2e5179a72526e3e57566",
+ "lib/numpy/_core/_asarray.pyc": "ca981d4fb1e3cf75d0a3d4e5bc5b415c96d84c1774104d1eba2fd73d1d720870",
+ "lib/numpy/_core/_dtype.pyc": "fc1332fd4e846bffda17f78d9f415d4869e646d9937cb1dd799f4e7943a079ce",
+ "lib/numpy/_core/_dtype_ctypes.pyc": "951734304c07bc4ed6ed83336cd7b63727fd1f7caf8008e17115dc492915e364",
+ "lib/numpy/_core/_exceptions.pyc": "f344e794128e92a6ba30bc81f195d8570374f1a7dab63be486678e48b6addf25",
+ "lib/numpy/_core/_internal.pyc": "8dcc375e4f4b25424af9d39747726f30202b7e2793c293f2a8008381f50c5573",
+ "lib/numpy/_core/_methods.pyc": "7ff6f29d866a78ba4f5a2dd756ec9ab37f3b563b0a8e9542203932b14191931d",
+ "lib/numpy/_core/_multiarray_tests.cpython-313-x86_64-linux-gnu.so": "11be2d8caaaded5d9d4cb92300c57b679c2a2cf911c5463d53d4a6f342692b09",
+ "lib/numpy/_core/_multiarray_umath.cpython-313-x86_64-linux-gnu.so": "20940059012771d5b788237d4781e9f65ded45f187a39014bc7a7365276683cf",
+ "lib/numpy/_core/_operand_flag_tests.cpython-313-x86_64-linux-gnu.so": "d4ab4fa1a47704f5e009b454fb226d79087dec489778d24956f753e6d9fe3009",
+ "lib/numpy/_core/_rational_tests.cpython-313-x86_64-linux-gnu.so": "12af246c8760f96e9e13a755d0a92c90ad931352d934486f20bb044acd400f1d",
+ "lib/numpy/_core/_simd.cpython-313-x86_64-linux-gnu.so": "e45758c525bfc1dac5bc020c31be2645d6ba426bc52df27b73a91ddeaf393ce3",
+ "lib/numpy/_core/_string_helpers.pyc": "2aea3128d3e81ab464a07c3ac8a176cc9bd9636ca5fe920f39ed430eb7e1d76a",
+ "lib/numpy/_core/_struct_ufunc_tests.cpython-313-x86_64-linux-gnu.so": "2ae3135138340a5cf571be637908f5057ce1fb03345a551bd8f4d77955bccb26",
+ "lib/numpy/_core/_type_aliases.pyc": "b8d9e0a76a5fcd5180b20fc84619cc2a9d16962a9158af845dcc6dcd1484b4c8",
+ "lib/numpy/_core/_ufunc_config.pyc": "32c32ee0cb28e088ef9ec821758a089004a3d28e5041f8499b4d7859f737390f",
+ "lib/numpy/_core/_umath_tests.cpython-313-x86_64-linux-gnu.so": "a4af4f6d4c1738bf387c7157120963d54530363154a2b8edbadbe5d0fee648ac",
+ "lib/numpy/_core/arrayprint.pyc": "4ea0422c31ab3a227f848d848fafcaff2aa2c776c89b2dc51460d65ee984f05b",
+ "lib/numpy/_core/defchararray.pyc": "8950d13b397ab697c297e57bb6728449158eb382d01b33ffd9823e074e03f3ca",
+ "lib/numpy/_core/einsumfunc.pyc": "84f59f9df97f8695504b58f04dc585c2bb8818ebcc4d80d42af2fed8fe712928",
+ "lib/numpy/_core/fromnumeric.pyc": "e8c8c75c2f28523ea9ca9bcdf64c5cff7293949dd092d14e19dc562d2952c1f6",
+ "lib/numpy/_core/function_base.pyc": "8c2542674a6b8965b6feea176f7e9ab9713b008abaf0b6d10512d7581fccf948",
+ "lib/numpy/_core/getlimits.pyc": "151f93fda5e1168c2c4e547dcf4bb0b32233c4318dbb5f11eb85577e631601e4",
+ "lib/numpy/_core/libgcc_s.so.1": "137f5385f2fc44139b4c28b230e7e3298da51b04da7fccb0ec2e0a108054da1d",
+ "lib/numpy/_core/libstdc++.so.6.0.34": "f3eb617c6c2b6f14db1e113aee0406afd0c3e47d753eb0e854adc8bf9a4d86d6",
+ "lib/numpy/_core/libz.so.1.3.1.zlib-ng": "b5d8498c0788ccbed7c7cec20e4c13b952e4a2c902432d72a8e3e594ec4ed3d6",
+ "lib/numpy/_core/memmap.pyc": "e6c4f20613db6e30acfdf9d29d1ecce0441f7d88804e99e20fa60963a364caff",
+ "lib/numpy/_core/multiarray.pyc": "1da94c0d86a08cde811dc629b288cbe0f479bac67d1a5cb2477257307d19f72a",
+ "lib/numpy/_core/numeric.pyc": "a208fa40f3ec695c17ff77eb48554c7729baf71d3438b7f31508451481bc302e",
+ "lib/numpy/_core/numerictypes.pyc": "4720743b67881b3da9ea2205a277caaa7a8cb2b215c9931be7f7d92606a20a9f",
+ "lib/numpy/_core/overrides.pyc": "4774195868cb7c2e99032a378e48db4246ab8ad425ba66bbcfc19678f561de73",
+ "lib/numpy/_core/printoptions.pyc": "33bf65ff929f3539afb55094d849b60af23fef69071834d439730e21efa9194d",
+ "lib/numpy/_core/records.pyc": "1f7de77758eaa5ca7a72a947982cd7c57c2643415374d9b422f3bf18408a46fc",
+ "lib/numpy/_core/shape_base.pyc": "abf1b8657de8e9c691a532a558731b6a511c39f1e3e98d7bd9609e2788d806d3",
+ "lib/numpy/_core/strings.pyc": "ac91b6d6f81b73020dbe6d139212dd8eb09e55c45c5d8b3d6bfede7ac139cc59",
+ "lib/numpy/_core/tests/data/astype_copy.pkl": "9564b309cbf3441ff0a6e4468fddaca46230fab34f15c77d87025a455bdf59d9",
+ "lib/numpy/_core/tests/data/recarray_from_file.fits": "340d24962cf7d4594b9d8c6fde9a737abb8e36a35892e12fb6ce70cd711e21ce",
+ "lib/numpy/_core/tests/data/umath-validation-set-README.txt": "a715b039a1866a169177e0250227437e870bcab0220e9d3085fe610bb858c2a3",
+ "lib/numpy/_core/tests/data/umath-validation-set-arccos.csv": "c81973f2be919e701885d9686f3186a3614a63e0e849341a3f6eb2f35dfc6b72",
+ "lib/numpy/_core/tests/data/umath-validation-set-arccosh.csv": "d065deed71b56778d701c2be3a5128b7f0dfdcc7ad0d04a56e6dcc27ffe23109",
+ "lib/numpy/_core/tests/data/umath-validation-set-arcsin.csv": "c3f4afd8d0e7fa62d9480a9be7a253da0e1ba81cf16008a179d5b11ee7fcdae5",
+ "lib/numpy/_core/tests/data/umath-validation-set-arcsinh.csv": "0d9acc6286596723350c3c97354c52973c7a6ce81a8e74522d6033c5c3dc93c9",
+ "lib/numpy/_core/tests/data/umath-validation-set-arctan.csv": "d1aa2c5d9fbd0d84e8a74963e1b7dc04dc1856f8d9756d7785b3114d1453995d",
+ "lib/numpy/_core/tests/data/umath-validation-set-arctanh.csv": "1c42bd78fc753a42ab5c82a4314574231ae6b03a8896029d76223e2ef176276d",
+ "lib/numpy/_core/tests/data/umath-validation-set-cbrt.csv": "bfce7931366287e7d9a7f1ae103b2ddaa688b315386bbbe501b788272db12a97",
+ "lib/numpy/_core/tests/data/umath-validation-set-cos.csv": "d0f3670ea2a4a2467b11154381b7acf0a35973e21226b65495565ce4b916d7c1",
+ "lib/numpy/_core/tests/data/umath-validation-set-cosh.csv": "24a0b89caaf7c13cc0fd7352890bd552af73918cb8763bedbb6fa3e1967fece7",
+ "lib/numpy/_core/tests/data/umath-validation-set-exp.csv": "ad401621bbf278a87dacf7e9da7d19abb00aabf9ef1e981b8332e3025961b1e9",
+ "lib/numpy/_core/tests/data/umath-validation-set-exp2.csv": "763a2c4feddf4e988dfdfff658eba680cbae2a00bf5e1a553be42c505c08eae5",
+ "lib/numpy/_core/tests/data/umath-validation-set-expm1.csv": "2bb8cbe8de0a4065fbd5f8f986f624cdc31793b32641eb3c170acd7f2acfa605",
+ "lib/numpy/_core/tests/data/umath-validation-set-log.csv": "ca7cdb55b2b1173c56170c479f15fb1699bebdad3da08de82b5fe54ded7d838c",
+ "lib/numpy/_core/tests/data/umath-validation-set-log10.csv": "34e043fab39623f14f1b85666f3bb726d5fd500f37f1fd80683140fb06a2a860",
+ "lib/numpy/_core/tests/data/umath-validation-set-log1p.csv": "b5d6d858fa96233f0111b232925ca787fb69409ce8f7bd0475de1e93a0ec3dbf",
+ "lib/numpy/_core/tests/data/umath-validation-set-log2.csv": "dfd1140f4bc531bc32a17a0e8600a689de8d78401053b15fed01633ec54e6c81",
+ "lib/numpy/_core/tests/data/umath-validation-set-sin.csv": "f0f5239d0fd87e6c456f8d9726bbe9be691e4a910e9445d298dbc82b85607c03",
+ "lib/numpy/_core/tests/data/umath-validation-set-sinh.csv": "5ceb0152e3dc32388efe97af31a96999dd2246fda09a787dbbb6d5f592cb83c2",
+ "lib/numpy/_core/tests/data/umath-validation-set-tan.csv": "1efd9650c22c71fbd0279639062a6e1e4e28138558e9029b429fe4351742a984",
+ "lib/numpy/_core/tests/data/umath-validation-set-tanh.csv": "8a895917f30ec964606126be4ac0f875fe669f214ad7cceb20223be34496a137",
+ "lib/numpy/_core/tests/examples/cython/meson.build": "bae5d53ca7a6355310e4c8840ea4b80578701876bde891e34b9d16c59b894bff",
+ "lib/numpy/_core/tests/examples/limited_api/meson.build": "60ce51c16ff0685ca69564871610823873ba282927a283748c28aa49c2f48b93",
+ "lib/numpy/_core/umath.pyc": "8f4fb343068eaa60c4e3b90166b25cf4d08a1094706789bfba0760d0628738ff",
+ "lib/numpy/_distributor_init.pyc": "18e616343aabceb89974450bb5c18e90d37e178f44b888012dd029f74f967d1b",
+ "lib/numpy/_expired_attrs_2_0.pyc": "70bbce72f70af2a47628db38a78e0867dbceb75328e319d6d1148a823a8c7e9c",
+ "lib/numpy/_globals.pyc": "aac7e4f2544c71006e40c20541f55e9b28c74f546b606f625bfbd3cae313af80",
+ "lib/numpy/_pytesttester.pyc": "b5e2722eed9df62f6e27aabf48689dcc65a1736daf0cec762ac3f1808c6ee0ff",
+ "lib/numpy/_typing/__init__.pyc": "51976eb1fe1d937c8f1f118f44f983d4a5c5484d5f58c66a8af05c2546897c5c",
+ "lib/numpy/_typing/_add_docstring.pyc": "914a917327b33ed85cfa739e33e8db0a012dc792873f915a76731655cb39a46a",
+ "lib/numpy/_typing/_array_like.pyc": "f52328dfacd78b927fe771e618602983665f0a0b1c45c630f9541db67489b730",
+ "lib/numpy/_typing/_char_codes.pyc": "e900e7d8c5145431572e11410484d0b2f7f76e0ff7989ed2681cf6d1202dbc54",
+ "lib/numpy/_typing/_dtype_like.pyc": "57cb2dd6afeb3fdf05d99a7edc6dc516612e5c9078369f82565d15315d51edd1",
+ "lib/numpy/_typing/_nbit.pyc": "0feace3ecab8cbae16750137cc06365751b286f46861565b979df59be7bd5b29",
+ "lib/numpy/_typing/_nbit_base.pyc": "a01a1f9ad2e50089bb81eb108c302135103277da2d0ee26678f0e39613476f7a",
+ "lib/numpy/_typing/_nested_sequence.pyc": "1e4a8909fe4c258b07e417535ec3fa04dc18f20dbabe0cd09ebace840c6fa64a",
+ "lib/numpy/_typing/_scalars.pyc": "2ca858733e40fe5626cf455f29570c6bced7f1c5b163b04e2511affed46a754f",
+ "lib/numpy/_typing/_shape.pyc": "1756991398d34bd28f96537a75b315960495927e9b9aa75237b1b30974032406",
+ "lib/numpy/_typing/_ufunc.pyc": "b038502b1ce65b6a82ff8d9afdeac635557d62040f22b00783bea71fad8cf71b",
+ "lib/numpy/_utils/__init__.pyc": "e8081478f782a0c491c7defd4094a31bdc3f0ff84026353c975def64a5e79ec1",
+ "lib/numpy/_utils/_convertions.pyc": "6755864e0307ae56ee79385cfe3925557fd77581626148361a24c668616fe624",
+ "lib/numpy/_utils/_inspect.pyc": "8e9de982535a06076c1a1550d1ab886ad14e94c60edb5eca74862da8ced0a7e5",
+ "lib/numpy/char/__init__.pyc": "f7f4aa19c7e10fd000217a5165f149381e3c216e1b6c98a923d32e2031117ae8",
+ "lib/numpy/core/__init__.pyc": "06309cac2efb42ca34bb439e1129fca20d81e0d8d0fc97bb6320abf22395f081",
+ "lib/numpy/core/_utils.pyc": "a95be52bfff0a6dbd791b661692ea2791824642f01429f62337119bb3821f440",
+ "lib/numpy/ctypeslib/__init__.pyc": "aac5e5036edb8abc7933605dd43244d1aa52971dda08bd58b967e87b212d5200",
+ "lib/numpy/ctypeslib/_ctypeslib.pyc": "c2d3657f42aefc02590d42e356fccca59edf82e9455aeec8f9505424f7ab8100",
+ "lib/numpy/dtypes.pyc": "6e1a96f7044e3ec605c40fd1ea2bbe33765719632242ba3f95767a684fdcf9f2",
+ "lib/numpy/exceptions.pyc": "3c6dffa11f46e3cbac539a18849b0f58d1d7d3a7c186b8710b6af79a31c4fb8b",
+ "lib/numpy/fft/__init__.pyc": "513d14493c2a4d77a09c397cc23b241af77332b2a94872357cd081c89c77b134",
+ "lib/numpy/fft/_helper.pyc": "320d87ff22f066492008c35efabcfabaee94793cef82be6e93420043b7dd360e",
+ "lib/numpy/fft/_pocketfft.pyc": "01e96e62adecf0246ce047f417582963938b4c1a3e6fbb71a307184bc3f37432",
+ "lib/numpy/fft/_pocketfft_umath.cpython-313-x86_64-linux-gnu.so": "dd31cb2498792214ab9ec3e2ce24cebe3f5418d91735493e5a81ad3f5701b224",
+ "lib/numpy/fft/libgcc_s.so.1": "137f5385f2fc44139b4c28b230e7e3298da51b04da7fccb0ec2e0a108054da1d",
+ "lib/numpy/fft/libstdc++.so.6.0.34": "f3eb617c6c2b6f14db1e113aee0406afd0c3e47d753eb0e854adc8bf9a4d86d6",
+ "lib/numpy/lib/__init__.pyc": "10e4c208dac670fe9cfd623b6770d44ea8e2ee59c969bad34fb3647a0a88cd60",
+ "lib/numpy/lib/_array_utils_impl.pyc": "b25af46750053f8efefd1a87d024b78db03a1c297ed576a56a68ea848f0bd0ee",
+ "lib/numpy/lib/_arraypad_impl.pyc": "5ede93f349374092b5482124622b1c4c03b2593cc3eed68af10ae7b19cfacfbf",
+ "lib/numpy/lib/_arraysetops_impl.pyc": "963ae864a6d22340515c33526b08dc3cab9f5703174828ca6f701999437b1c09",
+ "lib/numpy/lib/_arrayterator_impl.pyc": "7bbdb6c498377d31c82e360e4e024bb3b33373abad4c761f595bdec4488afe33",
+ "lib/numpy/lib/_datasource.pyc": "3420526ae244c17b1e984983eef40a26a8c3649fc13ee2af99d2c6e723fdfc56",
+ "lib/numpy/lib/_format_impl.pyc": "4dc720dc7eeb525fbfcda9746a0ad84f74fb8c02c0321c93ba9d385f894c6e6e",
+ "lib/numpy/lib/_function_base_impl.pyc": "382237ab7643912d5e760a0d64e17577c29d9dde12125f18d70563e4e04e7e4f",
+ "lib/numpy/lib/_histograms_impl.pyc": "6096f6d07835e244da811a380f513c998170041bbcf0d7d2adc449c55c661aab",
+ "lib/numpy/lib/_index_tricks_impl.pyc": "74bb133604ef10492af15ec36feb3dec5565f813cb633dcc0a96517499d30128",
+ "lib/numpy/lib/_iotools.pyc": "ad023ff00ff578c30ed4b369926369eac5e527baa0a08a3e3ff126f9255e21fe",
+ "lib/numpy/lib/_nanfunctions_impl.pyc": "26044dc554cb540cd14c7114ecc0218f6f8f87897ff4f1e28a5c89549cb0572f",
+ "lib/numpy/lib/_npyio_impl.pyc": "99401d6f64c65f0cd656ebb6c3f3e7f80814c0393044b631bdb5fe0b78d0cd07",
+ "lib/numpy/lib/_polynomial_impl.pyc": "5ccd1cad5d415753e321eca2afcfb19e57cd4e7f354808d62df305745dd74d8c",
+ "lib/numpy/lib/_scimath_impl.pyc": "b60903f725675414550cbfe8cd0b92a7230dbb30951d2c69c4aa09766e2a6084",
+ "lib/numpy/lib/_shape_base_impl.pyc": "bbfce42c11c1aff85eb299c4c84a2dbb1c55a051fc8e9874eb7a45c69de1e272",
+ "lib/numpy/lib/_stride_tricks_impl.pyc": "f89f9a3de8bf8ede353e368800243d27cb4102c3c72145bf918f6cf133ade9f5",
+ "lib/numpy/lib/_twodim_base_impl.pyc": "f6d18caeebf477fa9e890b0db7851325d55f99dc6fe6dfc22d878674c1527f32",
+ "lib/numpy/lib/_type_check_impl.pyc": "c2ff265e299cb0bcf07335e7645bd91130a310dfa46645874f05790f37c0072b",
+ "lib/numpy/lib/_ufunclike_impl.pyc": "aa397a7ac276ad46b496bec6865c235137d2fb5be38b3ea949924912cf08d519",
+ "lib/numpy/lib/_utils_impl.pyc": "4fbb5f57b19c5ec369e9a6ef26277f6fb62ff6e879f1c793a52891ae2e8ac88f",
+ "lib/numpy/lib/_version.pyc": "c59720feee99e14f483d9611905e4254fa21243b8e063fea856c5bf827937d53",
+ "lib/numpy/lib/array_utils.pyc": "8e13982ee30aa209cdf964f2f5be85c630b305eab2179d84362e53977c6a48a0",
+ "lib/numpy/lib/format.pyc": "cccba2a12e20f67dfde57eea448e1fd2a7e79be8ecec7439e409d484d811304b",
+ "lib/numpy/lib/introspect.pyc": "8e20a55860abd8345be7b02a8c19931948ac0898a149176b8a756a9de15fa340",
+ "lib/numpy/lib/mixins.pyc": "b96bac1068f6031c1e74ecedb0dd9ec7122880b90ea8bdaa3219de27acd0a72f",
+ "lib/numpy/lib/npyio.pyc": "4c2b643f9a2ef5163c29afb9686fd718ef92198f15b538cd3e10d045b38c0330",
+ "lib/numpy/lib/scimath.pyc": "73aee0a3e8b670a2ed60fc534a984cef5a4649dfb96925dd7de6fd4115c7a7cd",
+ "lib/numpy/lib/stride_tricks.pyc": "82d805a08b6d6107ecdfed97ca57c4142984a1620d63436cd7a83abcc9ffe4da",
+ "lib/numpy/linalg/__init__.pyc": "4cd4f7e6730567b5147500042087a6692c89b8f1a0c91df63b57acb6baa18df8",
+ "lib/numpy/linalg/_linalg.pyc": "c973f65bd929ccd935550f86753d3a47ef0d9f748a9587dbf7167f4364334e24",
+ "lib/numpy/linalg/_umath_linalg.cpython-313-x86_64-linux-gnu.so": "5639a0ca5c9b92ed7d3c0e77bca0ec1d79155d013f4d937ded46134e0d02e091",
+ "lib/numpy/linalg/lapack_lite.cpython-313-x86_64-linux-gnu.so": "9fee4f796fa048898652dc90ae37d34084746b0b54f6f665a20f6b39f63f6e84",
+ "lib/numpy/linalg/libgcc_s.so.1": "137f5385f2fc44139b4c28b230e7e3298da51b04da7fccb0ec2e0a108054da1d",
+ "lib/numpy/linalg/libz.so.1.3.1.zlib-ng": "b5d8498c0788ccbed7c7cec20e4c13b952e4a2c902432d72a8e3e594ec4ed3d6",
+ "lib/numpy/ma/API_CHANGES.txt": "17fe235bc5f971805bce9730b5eca69289d39afce028a636906ac717502d9eb2",
+ "lib/numpy/ma/LICENSE": "05f3b88351988ecfad10abe92c0c50e5875c6452d5009a0084cc291551ffcca6",
+ "lib/numpy/ma/README.rst": "92b7f672f54aff33507f5777c95630834b831f34e2478bc76ebf75cf0680ca82",
+ "lib/numpy/ma/__init__.pyc": "b7b154b2286d7611b7bf301bf8fd8251ea45369cfd5b8a86eaaf6c2e00768e9b",
+ "lib/numpy/ma/core.pyc": "9d85c1ae24ef3f0d2153ec28fcac246003a0a35888b0828c435f9621a73d7d1f",
+ "lib/numpy/ma/extras.pyc": "3b460685f1911c672ceecf39352b3970bd3ba20025553e22719f8994557c790d",
+ "lib/numpy/ma/mrecords.pyc": "65c3877b7602ff83c3d0abd81a35108b71deeac3b4f39614de1cc74287afef0e",
+ "lib/numpy/matlib.pyc": "756daa3e71486c65560aa5bc13209f1eb7c4d20b5eb4d1f74028d16e16c530e5",
+ "lib/numpy/matrixlib/__init__.pyc": "8b201550ba35a259e63242a676abbeea82408a0342e72a3a9fea1043f2bf3c56",
+ "lib/numpy/matrixlib/defmatrix.pyc": "7acf739b62bb58195e210c99592aaefd58485f0fa97de29f17fcffde25571492",
+ "lib/numpy/polynomial/__init__.pyc": "ce14eddabeada136776461aeef702419c77021cbfd368983050ef57809cad16f",
+ "lib/numpy/polynomial/_polybase.pyc": "67477fd9dbb43c08cdb59c75c34e4c3f3025f62134d6e461236ef28f39dc21f1",
+ "lib/numpy/polynomial/chebyshev.pyc": "263d6a8c2fa641f4b7594c80d697c84888b741134865ecd194687f69cd538fb6",
+ "lib/numpy/polynomial/hermite.pyc": "ac8a5f7913b950b2dd61a313610d49e6b5e186b66c69c7d684c7fe57d9e8b4b3",
+ "lib/numpy/polynomial/hermite_e.pyc": "f52afeb484e2aafcf7626d8ddd9082d54f86dcf20c316639e1af61c079f5c28b",
+ "lib/numpy/polynomial/laguerre.pyc": "f5538930fe9070a2263cbe7c8c0e838534444d44330aad38ea4075eebbe27465",
+ "lib/numpy/polynomial/legendre.pyc": "b894e5ef9c39c6b9e011ded9b026bb0bfcfe2a4b690b0c4d68e4cea7c1461c10",
+ "lib/numpy/polynomial/polynomial.pyc": "2e8fa5aad5d10fc490ac3e2de6dfa6cf35f0a28eeadd7e5e9a54ed2f2b05ebda",
+ "lib/numpy/polynomial/polyutils.pyc": "0cffadebc90f1590ff44f963c2de28410c8328305b5dbea0fa6779fa0ff40527",
+ "lib/numpy/random/LICENSE.md": "103166b62b80443afb9eb3488e052ea06be0cff566b908f199e561fde49af19f",
+ "lib/numpy/random/__init__.pyc": "85caf953acb6cdc6e3a5f6fd4c87cca2b28acf471918a12aa657612cca780802",
+ "lib/numpy/random/_bounded_integers.cpython-313-x86_64-linux-gnu.so": "4207eecdda788292bd4cea616f81d7b50d2f677658432ac9fbb8e5f58819dccb",
+ "lib/numpy/random/_common.cpython-313-x86_64-linux-gnu.so": "e3932d8b44ed4847257e87397dd3ad12e3fab19ce9aafa69ee184c59f0388177",
+ "lib/numpy/random/_generator.cpython-313-x86_64-linux-gnu.so": "1062c4b545a4d3a04fb15d4ee0d4c877b45b9583600aab7745abcf438a40b94c",
+ "lib/numpy/random/_mt19937.cpython-313-x86_64-linux-gnu.so": "76da76d6cfb50e1559417861273d9c6d9b4214f86f9322ae5199bd21ae507669",
+ "lib/numpy/random/_pcg64.cpython-313-x86_64-linux-gnu.so": "424dac00b22272be82581f7db30cb6390d0ab8f9315a2877201e19243f553b94",
+ "lib/numpy/random/_philox.cpython-313-x86_64-linux-gnu.so": "8a65b68bdc552f2701ce7c51eb8ed57b560153d78d41867e5a3aa923edb6594b",
+ "lib/numpy/random/_pickle.pyc": "85a6d9879b6bbf46a450b71128a1611d1d47e14442350a583b46f055d628dafa",
+ "lib/numpy/random/_sfc64.cpython-313-x86_64-linux-gnu.so": "ff4b7acde2f14da301f34ca00777acb61a8642188f97a74dd8448981a7014f95",
+ "lib/numpy/random/bit_generator.cpython-313-x86_64-linux-gnu.so": "88c847a4e3ab889c0b4111f8dee8c32367792672b38ae1741233601a3d09539a",
+ "lib/numpy/random/lib/libnpyrandom.a": "b9d7d11751ddf00f1d7d5384821dfd89cfefa78a2aadf5e07e6185d6070bfb6d",
+ "lib/numpy/random/mtrand.cpython-313-x86_64-linux-gnu.so": "fd0aa848f08d1f54f47aed1aaa019a363522e48d0cb7efe883f887c5dc7a3be9",
+ "lib/numpy/rec/__init__.pyc": "0bdd544df71bbaac930045c1549ee81f761b0f44cd52a5d293fa50b3a2b1a724",
+ "lib/numpy/strings/__init__.pyc": "ae93edacfec719d6191df76787d9efe0e1d07dd6b3bbdb2bb23182c49dba7d6a",
+ "lib/numpy/typing/__init__.pyc": "58160116bbee6d8da78c2f27f082e77fab32a6b774504a3713ed3d128f309afc",
+ "lib/numpy/version.pyc": "7e5b89eb8ef8ea1e7a29d3af65df42a8313900a36fccc22d44c3d92446e9b61f",
+ "lib/numpy.libs/libgcc_s.so.1": "137f5385f2fc44139b4c28b230e7e3298da51b04da7fccb0ec2e0a108054da1d",
+ "lib/numpy.libs/libgfortran-040039e1-0352e75f.so.5.0.0": "e725607dd70cf725c018b38b944bda70bc6d7cd7b5cc74918888cb1ddaf3bfd3",
+ "lib/numpy.libs/libquadmath-96973f99-934c22de.so.0.0.0": "6ed5137f412781ad7863439fb543613f620b43c32b63292a0029246162f5bbc6",
+ "lib/numpy.libs/libscipy_openblas64_-fdde5778.so": "628706f08ff8c397ab630f392eba478a4ffb2d10290382b120c98486937663c4",
+ "lib/numpy.libs/libz.so.1.3.1.zlib-ng": "b5d8498c0788ccbed7c7cec20e4c13b952e4a2c902432d72a8e3e594ec4ed3d6",
+ "lib/packaging/__init__.pyc": "e9219105831b35436d85370035acff10778ff4cb8ff57244edad208f68448925",
+ "lib/packaging/_elffile.pyc": "187b07230620ca43781b71e30d41448b472048830a5c623516600d130c00bdcd",
+ "lib/packaging/_manylinux.pyc": "44f193526edb18b2b97cff690c7fb2e2da2be39b8b9ff54f639f419110952746",
+ "lib/packaging/_musllinux.pyc": "32a7ebd23bfb17b16d141fd8760cb30b323422942b449e962749355d53944784",
+ "lib/packaging/_parser.pyc": "bad2526defaeb32fc5aa072d1914536cf5822c17c0a878d5ac3f8ebbea45e77a",
+ "lib/packaging/_structures.pyc": "10c89c665d31c4281c9899665ffe68ca520f5053dcd5a3c6d5ce568623fceb73",
+ "lib/packaging/_tokenizer.pyc": "0d49810ff124a04403d239dc290e2b35a99e884a0a9ac32db6ebfa57ffd75950",
+ "lib/packaging/licenses/__init__.pyc": "511e85848e4a2ca4dc54bd68cecb40157bc3664745e1fe71df7d9683f2cfbd8d",
+ "lib/packaging/licenses/_spdx.pyc": "e768c09a8844ae8c8f6289a3a58fd4f61900696333f27ab46e435154863f99b2",
+ "lib/packaging/markers.pyc": "373813498faededa2d1e8b6edac54d08a5616905cca3011f488379671631eefd",
+ "lib/packaging/requirements.pyc": "5fe8e69904827462840d0cf7717223ae05da076e736e2bb01a183691548631ec",
+ "lib/packaging/specifiers.pyc": "644b0d8117554964965923bf9bbf8c5b3db9ef05fb1d031944f010d4f59b3b0f",
+ "lib/packaging/tags.pyc": "d47374edd751e5eae81829cbd6fb2bc2a35d91871f0322c5199a15f26b1953fb",
+ "lib/packaging/utils.pyc": "b5bf9583706d653cd093bb1955c40b3fa53bc99a558ba7e19d97ebc425306458",
+ "lib/packaging/version.pyc": "e903aad86214efbc99e97fa67f09801b0e1dbeafeffe8759b9ad20d3c78f4cd5",
+ "lib/pathlib/__init__.pyc": "00e86247c331ce78b1aa77c2adb4c45c296cc17452a614baf55568c9b7937b32",
+ "lib/pathlib/_abc.pyc": "286b7fea455fb24bc2e5159dca1e0972d79d5f4d3a1926b4886ee5b485f2f8ca",
+ "lib/pathlib/_local.pyc": "2455b17e044e7f683ac2e7e6ed8f6c157b58bad33ff7e7b5167220c73560ddee",
+ "lib/pkg_resources/__init__.pyc": "a6c037a2b0f0b55191aa0290536c8c070b2b750c3695e3d0ae7b7f4f953c32ad",
+ "lib/pkg_resources/api_tests.txt": "5c476fcb88a01c7aeadaa34734c1e795f3ba5d240a36a3b22c76e5e907297c02",
+ "lib/platformdirs/__init__.pyc": "0ca08fc90613ee2f870cc4adf34dbc075159eb99300243b484d849fa3a8ca3d3",
+ "lib/platformdirs/android.pyc": "8e979426ede720da5f14dbccc900f5c88ebaf6de2c7d50d6bda8d73c4c03c975",
+ "lib/platformdirs/api.pyc": "4b73f691b8ef897040720c8bb34588108adbe8e4ea906b75690947893c49bc43",
+ "lib/platformdirs/macos.pyc": "afbab25058ccb6ecf4af6cead531794b86f4706c695a718511cdc419e26f8acc",
+ "lib/platformdirs/unix.pyc": "63fc1f5f293d88ff30597aa03f6bb776b5f38114788910a574fd0eccf1a0c2b1",
+ "lib/platformdirs/version.pyc": "8ed3c8401808898027372450f279f82ba8fa6ccf4b33f1ea1b7c53f7d0ce2cc9",
+ "lib/platformdirs/windows.pyc": "4478630fe6b7fee6dfbc637ba05c9ce197fe68fed3ec7f8968484ab22169df6b",
+ "lib/pluggy/__init__.pyc": "0e0fa1fcccc1a82b3347d93c25653ead33ad84c8776b27bd89e118bdafaaebc1",
+ "lib/pluggy/_callers.pyc": "b43cb06d03c7bbcb995dd164512f9de4954f3c49c8a74ccfaa3ff3bee4037d55",
+ "lib/pluggy/_hooks.pyc": "fbda918abf93e38441aebe8a188e91ab0ae21b106d58550481b6a5a054bcf167",
+ "lib/pluggy/_manager.pyc": "8dbbd4292b0e214462c598aa5427484efd75702255ea53f39c70cdb23e7faa8c",
+ "lib/pluggy/_result.pyc": "79dc65665553e2b8b1561aa5bcfa916838891142095692402892d19a6fb1a706",
+ "lib/pluggy/_tracing.pyc": "fde5eb7e859f442c5e72fac4b424f3b505f4df4cc03f53fc92d3735b7cad086f",
+ "lib/pluggy/_version.pyc": "1826b2c4ff36752e19faf5134a27b5c0c3008d059a0f6d591ab9e81815806b73",
+ "lib/pluggy/_warnings.pyc": "17997cd232ae8ce72c7fd44b37230e0611a7dd09730c7537901bee5a8598b57c",
+ "lib/ply/__init__.pyc": "0e0b92b375b8b9e30c44d8519bf1f2d10efdf10a3b12a907f0b4cb9da55a8ce3",
+ "lib/ply/cpp.pyc": "05d7b48b3a984c897c6a7ed510ac5e26dc88fbe74978fda65c9cad43c2638c38",
+ "lib/ply/ctokens.pyc": "1c4755602ccfc100bb9e30db7b62e972d9501087b4cbcf655c394b2cc22f167a",
+ "lib/ply/lex.pyc": "575b186b80559cedbcb06df3c4cfacdcabd6760267e30f00f3354b72e084f9bc",
+ "lib/ply/yacc.pyc": "14f3a654d3eadc14dde8e9f38dfb0417f2c8204a6c514c397ee3d3022a60e1e6",
+ "lib/ply/ygen.pyc": "f596e9dfd59a10d71227234977d5caf73fcf53fc16d6057b767d2f601baddd1f",
+ "lib/propcache/__init__.pyc": "5b1c19100879205e26e5be6303235c3576d32bcb762f820a1111c0aaba1556a6",
+ "lib/propcache/_helpers.pyc": "f2ad2dd490d1227a18538441f6f6dc8ac688e91d6e50424d8bbd792921fdc536",
+ "lib/propcache/_helpers_c.cpython-313-x86_64-linux-gnu.so": "7044309284f4d9f5cce8c819460e6911e840d07ab30d1fca087795b2f70f53a9",
+ "lib/propcache/_helpers_py.pyc": "01b89769a0c76c8798f3f1650bfd2b059023967b9251a9987949ca004e30e136",
+ "lib/propcache/api.pyc": "5a128c4990729c78b89c89ed18beb00a6e1ef35136d257cebf34136c61b79e1f",
+ "lib/psutil/__init__.pyc": "99130221ad3c42549a34e01367c47391f8a5fcf9faef5dc0f22299daa5483555",
+ "lib/psutil/_common.pyc": "a92e7ab32fe9f7a4969366d797bfe3cbafdcbfb08e3d951816e876d046cf1242",
+ "lib/psutil/_ntuples.pyc": "d949a5f6061b05a8e8510f609ea08c3300e93c1c3fd20a3213e3cb58beed1ef5",
+ "lib/psutil/_psaix.pyc": "051a02a3026525bad84ef29fa81053e58d35542180493a8d4b456d3570a96bf4",
+ "lib/psutil/_psbsd.pyc": "2b3d326c17969ec5939ce5500c6b5a83be31a93cf20a43f966ed9b685adf9e54",
+ "lib/psutil/_pslinux.pyc": "a9d916bb91125563bb2bdf036c7ceba0bf8b7c1cf373b5b8f717515132a2952c",
+ "lib/psutil/_psosx.pyc": "ef30bc1b62fb154e60597116766d98a0fba2157cf044d99bc1cd58286a0c048b",
+ "lib/psutil/_psposix.pyc": "8afc71bb2c2d8e0884a46538f7c967b275ef6c5a130d4256674df722c45b5819",
+ "lib/psutil/_pssunos.pyc": "8971ee9d52cdab2524046d92ea3eaa4448ca77d0e93e7f144cd35e759da31478",
+ "lib/psutil/_psutil_linux.abi3.so": "5882b762a1ba1f86d78f0546484d2d99c21aa1baa94c571bb89109d3b1c1c906",
+ "lib/psutil/_pswindows.pyc": "163ffc3ab41798a951d0e4da73d707c2145c74f6873a0d7a9f8313dd4c593b1d",
+ "lib/pycodec2/__init__.pyc": "3ad1f8807a294e84eebe9272b400f2064e2831e9820f77c97763c9ca2df51318",
+ "lib/pycodec2/pycodec2.cpython-313-x86_64-linux-gnu.so": "c691c2e291ab7a561c52731bf17c6b8479e69f6cedd176b1a5836094ecca2267",
+ "lib/pycodec2.libs/libcodec2-30fce438.so.1.2": "3453c1cac697701e680e521d03a9d51b4868416e5a827646fdc8ac02d196249d",
+ "lib/pycparser/__init__.pyc": "3386d4386f88fae0e7a454b69f98349cc4c8e6be099a65318b3e85cf963ccb0f",
+ "lib/pycparser/_ast_gen.pyc": "62fe3e4cddec1a9bed5bbc364657fdc9291fb0945e7d481f6b3731b52fc162bf",
+ "lib/pycparser/_build_tables.pyc": "525cfd8caf318c22133d557cb63e7c1e1160a7786525c6ddd68e78ebccb0c3c7",
+ "lib/pycparser/_c_ast.cfg": "95de5ecc4f72cc82452150147f0edecc94a5322e275ca342cdf9aa8cec904cda",
+ "lib/pycparser/ast_transforms.pyc": "da70858d4e9eebbb9bbc01c21975814e2f54c455e054a47e37f949b02275ca19",
+ "lib/pycparser/c_ast.pyc": "ce057e1895f7aa89785b3b5d5dc5a25c4b4892fe63d52e442df1a50595a307fe",
+ "lib/pycparser/c_generator.pyc": "54bb3debe6cd184dbc66907b9d6a74eaf4086281c516e9e651d69a1a703cf61d",
+ "lib/pycparser/c_lexer.pyc": "13cb26326f2a137f15184dd9dfff116b107803a374c040dfa14d3762db124e1b",
+ "lib/pycparser/c_parser.pyc": "c666b84488bdf41ef6384c942e878d6296b0471815d50fe84594c33bfc52b64b",
+ "lib/pycparser/lextab.pyc": "48f2d43e8e8b5d2f8485f88e0fcb5c818aebc41eadd3d29678f42c93aa38ea40",
+ "lib/pycparser/ply/__init__.pyc": "bea2cd1dcbd9ccb9ec0c032f6c621663baa0742a8a55e45a612de9db67c1acd6",
+ "lib/pycparser/ply/cpp.pyc": "c896555a4b8d53e9ca3d0c50eb2eae60916248042a6899e0562563aa5e28f813",
+ "lib/pycparser/ply/ctokens.pyc": "3850e9692a2f4b50f3838db77a77045e8821472d3b5196688b27c0b32052db9d",
+ "lib/pycparser/ply/lex.pyc": "699252cc2e0e916534457305d8229e22d8fa732fd0692f34e930d7549b72c3ad",
+ "lib/pycparser/ply/yacc.pyc": "e93faeacbd9995e1057ae11c5f0d29fa2835d21fc2f01bf0bd359d363ce0c266",
+ "lib/pycparser/ply/ygen.pyc": "9fdbf5e69d0e8d0c0a20757dc2f12a88ff68bf5bc7f66aa296d249978fa97e97",
+ "lib/pycparser/plyparser.pyc": "e9f2be80505aecfc0d1e3966444add367577fb6c8e47d7f50eb9d8d732761d3b",
+ "lib/pycparser/yacctab.pyc": "02ed2d97f180ae0e27ab6711a96bbf7a6984393c616180df2f87ae5eeb5168aa",
+ "lib/pydoc_data/__init__.pyc": "55e03b3265e793993411e1785afef3b787781e0e29fbe4cbd72eb0ac0c505b37",
+ "lib/pydoc_data/_pydoc.css": "038d4bf51b4d373284640f3658d70eaa856def24d8d02b8e29b289beaabf1cc9",
+ "lib/pydoc_data/topics.pyc": "80fcd8c2baea3fa596720ccb74918aaf41112a0739fa71543584b736b1e195b5",
+ "lib/pyexpat.cpython-313-x86_64-linux-gnu.so": "e023be7ffb4bbbdfe8441948c4ebf28c90c4aa0c54eb028d12e593ccfda276e6",
+ "lib/pygments/__init__.pyc": "9925d7e490df9aa5d4d4f7be82a708df4f250cf29bf557cf8b0427b0c19b1f22",
+ "lib/pygments/console.pyc": "b3873328a5dcb6ef6465871076694d5ccd160ecc5b53a2fbdc664c12e26aeaca",
+ "lib/pygments/filter.pyc": "489faaa0de666685906c67efd5285d90d6ad215d495f80ca2ec079a43de625e6",
+ "lib/pygments/filters/__init__.pyc": "b9b16ece9cb668bf4720bc8537d477419520df8bf795f0f8b356bb15453b9e9d",
+ "lib/pygments/formatter.pyc": "7d63da1ad458c938776df49149459fe8d28a4ff9a73ef9b259342ac9c0b4033f",
+ "lib/pygments/formatters/__init__.pyc": "b1e24b0e40f7201228cb6297fb7198d43f59cc848d4792f8f75b3447995f4dee",
+ "lib/pygments/formatters/_mapping.pyc": "e38923f5c887fe2154f70a6a157c74c4709e0c6136df0b321e0be7592a442768",
+ "lib/pygments/formatters/bbcode.pyc": "4b16606370fc89080174fe9f096f5d6424e68087c8f54f34a6ff538f30b409e3",
+ "lib/pygments/formatters/groff.pyc": "3632564647a0536759b43ddcfff28a300b21e6aaba640f8edf1be37f8f302453",
+ "lib/pygments/formatters/html.pyc": "f9e9463e61576860ba4389dcff7300c2b3196d2c2ece9ea55f3eabbc0aa4644a",
+ "lib/pygments/formatters/img.pyc": "ef55ce521747fe88a2f96af6d04a663884a7866a00a7b97a05e8b4de87fd46ea",
+ "lib/pygments/formatters/irc.pyc": "1be805bcd618018ec22c3d12dc407b52e3fabf1b8888da3038abc20784067721",
+ "lib/pygments/formatters/latex.pyc": "9f9a66f40702c6790bd103bd2402b63b64d2657880f2b7abf0635d26eb69d3e7",
+ "lib/pygments/formatters/other.pyc": "626abf7fa9252f9738cc48e44cb4fbb658206523e249edc2b851893e3087cdfe",
+ "lib/pygments/formatters/pangomarkup.pyc": "c6cbdcbe725f663027cc97fc8e2f4a0774efd9f995d36126dc7b85827d04043e",
+ "lib/pygments/formatters/rtf.pyc": "3e1139c2b351e19d2c0a47722e5820e32b69f0cee72539f55e3b9e62a491cd8a",
+ "lib/pygments/formatters/svg.pyc": "9b682049bb513391a87570ba5a1a596c49962f1720404b80063f82e69c268cd0",
+ "lib/pygments/formatters/terminal.pyc": "3583c850136447edcd0b9f30a02a3883b17b8b2b11dfa183977d17960555665a",
+ "lib/pygments/formatters/terminal256.pyc": "37c26b832eaeadf81ae1f00d339c9c50988dec9011dda8a23fa8156b79e0d5a5",
+ "lib/pygments/lexer.pyc": "47df7e0139b8eca950ae61f4cdca449ac8abb85fc8f023f2e3d2952f72a8d235",
+ "lib/pygments/lexers/__init__.pyc": "0ab92e72379eb4b33e42e9414e872a0ee264c6f68602736b4917a6b9656728c4",
+ "lib/pygments/lexers/_ada_builtins.pyc": "68d5b2cf9d3c3d1cc91e48b70a8b61e05f808326a0097984d676109a9feb8b3d",
+ "lib/pygments/lexers/_asy_builtins.pyc": "3da4406454f5c35ba9361248e23df3953e5ae1085b8fa1728a7ae72897ed3b1b",
+ "lib/pygments/lexers/_cl_builtins.pyc": "000b53d8fefd283d17db4ec084ff2d56009b9534fd9f8e2a15dd273ed1101666",
+ "lib/pygments/lexers/_cocoa_builtins.pyc": "a62e025198a41ea19c6731bf72e2c852b25ad656656a31baca7d582136de6354",
+ "lib/pygments/lexers/_csound_builtins.pyc": "1060d85d1f14a0eddd1aa965942a650551ee9860d83e8633186cff4455f48e8a",
+ "lib/pygments/lexers/_css_builtins.pyc": "f8a5950da21eee72aab62513fa146bb03d7fd179710b8366684b864dbec3f81b",
+ "lib/pygments/lexers/_googlesql_builtins.pyc": "d04d1f9595935622b150b702cbecfce63ea50fbcccbc907480c0ef9a57c9f69f",
+ "lib/pygments/lexers/_julia_builtins.pyc": "5ae3ecbb3a6f4e620f1e13b0b86052b08eee1ee538262adc8bc667170ef56007",
+ "lib/pygments/lexers/_lasso_builtins.pyc": "e12156f9ef8c0206e7386ec15b4e9871d7f87e511677e3fa7606792e1ad12bd3",
+ "lib/pygments/lexers/_lilypond_builtins.pyc": "3e3101fe21809275298b55c223553387ce1c9b190a6050b36da6d7455a9905b8",
+ "lib/pygments/lexers/_lua_builtins.pyc": "6c395e89bb8be3c9749968b896cd9bb674c411cf5f4d622202c752ec96247647",
+ "lib/pygments/lexers/_luau_builtins.pyc": "68672f33dbf3e34624559b69f528c838f6699e091378b227fbf4397d6edb14a6",
+ "lib/pygments/lexers/_mapping.pyc": "545f8989d4358c196c821d63c424f07c1ce0317d89f1d88838c239f86c4d33e0",
+ "lib/pygments/lexers/_mql_builtins.pyc": "fff90bb675847d2abfa103d2478f3103a0b244d414628a4b0ef3399aa8f13764",
+ "lib/pygments/lexers/_mysql_builtins.pyc": "5d44cb1d66dd4e071cd30ce613eea72152705696f084e6119275e6dba6f22c66",
+ "lib/pygments/lexers/_openedge_builtins.pyc": "4ccc1390e39b1b9edb83b69568c02731e284db6f76423dd4c6586f6ca07063d1",
+ "lib/pygments/lexers/_php_builtins.pyc": "36c3c787a20c191ea3a116189f797cdef8ef4fa1dae981b97d2e358feadd13e0",
+ "lib/pygments/lexers/_postgres_builtins.pyc": "864db4185b2a0a1b331115169133f72e247c655464b04549d994e4e3a7c78c9b",
+ "lib/pygments/lexers/_qlik_builtins.pyc": "d1994e4c235b0f0deebaacd40930a272ba54059dff83ce969e8191588d67cc42",
+ "lib/pygments/lexers/_scheme_builtins.pyc": "13f766a55037b7a2bb840e49f091c6dea007a0dca6bfd99a28ab3e43e75a2eda",
+ "lib/pygments/lexers/_scilab_builtins.pyc": "4d81330296f4cea7df6b32d3f3d1620eabc58e9ba8d2cd03ebf230c14a319f54",
+ "lib/pygments/lexers/_sourcemod_builtins.pyc": "a12b8cd2814b3a3c2276e7693878ad5bb466461dace908283e6917a2a993f873",
+ "lib/pygments/lexers/_sql_builtins.pyc": "41ec9315ec9de15870a0349428f77f45083bb87cde3a8089adfa28558ba57182",
+ "lib/pygments/lexers/_stan_builtins.pyc": "007ce68ebf26eb88e44e468a1e66a630fa053efccb61035834eebd4f59ca83a6",
+ "lib/pygments/lexers/_stata_builtins.pyc": "fd15c883d5c267faf0752d95083f17383e1667f724615b4c57a53a101bd69d0c",
+ "lib/pygments/lexers/_tsql_builtins.pyc": "0ddba5a4777faf43c96521366cecb266a354e036827b960e4440843d8411ec6b",
+ "lib/pygments/lexers/_usd_builtins.pyc": "02cc569794dd7321f9b245779b298ed300066f6edba54285ab5194c0d1f1b45a",
+ "lib/pygments/lexers/_vbscript_builtins.pyc": "a16791e68655ee8d297380b1ff40558b89a9924aadee1aa6f93322a282920f7d",
+ "lib/pygments/lexers/_vim_builtins.pyc": "1a972f57a3d29269e492a2c7e5d03ce78cc69accc672c1915e521cc8473c6820",
+ "lib/pygments/lexers/actionscript.pyc": "9431534c5ea7d1609b05cf3d413d3d29014bc1ed0f3766310d4380ebd4dcf02a",
+ "lib/pygments/lexers/ada.pyc": "d5323f1823bb94d62e519b039a5fa779d9575064a78c1552173f74d74ee98d3a",
+ "lib/pygments/lexers/agile.pyc": "3fabdbbd80111385b6f1709c3e44a2e4ff0c7bfa26ce612341a509ad7dcbdad3",
+ "lib/pygments/lexers/algebra.pyc": "fc8d14619e24898ea076bc4215d3a1b87d799c6b61a3edbad6fc2d695abdb22f",
+ "lib/pygments/lexers/ambient.pyc": "29873781ed9d856d4b985cbdd446d55e843ebe293af6f2e1f9bbc6ab1bf7fd79",
+ "lib/pygments/lexers/amdgpu.pyc": "8ed490190e732bc55506a9d63575ff5d742146e84ca07f968bb3e420ddaf98f6",
+ "lib/pygments/lexers/ampl.pyc": "ca311687397201e22072e2261e9b44ccdc9d49cd130dc126dbd82cb7cc039edb",
+ "lib/pygments/lexers/apdlexer.pyc": "76291eb079cd9a49efa78631336b07c86771d9e293fbdf279b49aaa32fd3ecd8",
+ "lib/pygments/lexers/apl.pyc": "a9a6094d6443e4b459a40cca86fb1ef095e32308b079b0a129fc0ec261966405",
+ "lib/pygments/lexers/archetype.pyc": "72069a60ab5681385fb359a44eca5753c58183ea8bfe929ef6750eb1040297ba",
+ "lib/pygments/lexers/arrow.pyc": "032684a41ec61d783b321b57621ad0844adcfb929470ba05156930a06b9be356",
+ "lib/pygments/lexers/arturo.pyc": "32a87500ba1920a3dcb08139df6f12e7f7cb9f425fbba106a75ceef81002e012",
+ "lib/pygments/lexers/asc.pyc": "926c55e259f1fe6144eadd08c85865868579f851dc56c345699dc3e130810a3a",
+ "lib/pygments/lexers/asm.pyc": "b74b936719eddb4581a75af531b0753c5352cc0c4c297c7e7c53a3eca23339cf",
+ "lib/pygments/lexers/asn1.pyc": "746bab249ad4258c8e10950620d9efc1302928af46a5ba851bcdf8f0bef23ebf",
+ "lib/pygments/lexers/automation.pyc": "60d71677c7f3f6ed829bfa723b9dba22fd943c52dc3e5cccd032f141ba59c99d",
+ "lib/pygments/lexers/bare.pyc": "e3a3bb3bf5318cf1017602eafbd370e05a868b008caeb1ffc48bb762632ea8e3",
+ "lib/pygments/lexers/basic.pyc": "17776268bd5f0a80a2cdcd10f4479cd8e9b67495811a741e5479f3516c94f22d",
+ "lib/pygments/lexers/bdd.pyc": "33b45af6364879d4b1d90d9dbb66e651a09cc7d1344ea6ad2a1fe312ee6cc51a",
+ "lib/pygments/lexers/berry.pyc": "f3b88737d0b5bb53e882c201d067bf8eb04b1b205e81d516da2355052e1ab073",
+ "lib/pygments/lexers/bibtex.pyc": "451b26238b26731fdfd279bcdf06d9934f03e0d76f940ab2c20641cf919a3b59",
+ "lib/pygments/lexers/blueprint.pyc": "d6c117a34b8c6dc783ded1be8fabb7a1ac31f0307d2b1df35147ad31b0ad9b4a",
+ "lib/pygments/lexers/boa.pyc": "35bcefb062f752adb28a331d9f620bcc67db805543e70f4d33a271aabdf876ce",
+ "lib/pygments/lexers/bqn.pyc": "9035ad28ae6c18b98ba684c1a239bdd3a5e4c4943cce4d915113a94e1ff16598",
+ "lib/pygments/lexers/business.pyc": "d1845179b8247c5d1436b9afa2c0a833e5fac4bfce3489015f4b8cc42af50ea2",
+ "lib/pygments/lexers/c_cpp.pyc": "9c86a387350aa7e8c02bca19f281fac0554c9d159df3ee95a3f44f739ca4a729",
+ "lib/pygments/lexers/c_like.pyc": "12cc64c07f9f0678f9eef8fad49e9b171af985f275971355afdd1408dbb57e0f",
+ "lib/pygments/lexers/capnproto.pyc": "62a3a5c9e6a1a003bba8c5c1ee07d403f6af668291e3e36fedc3ffbed875a276",
+ "lib/pygments/lexers/carbon.pyc": "67496085c380b131f1861e1108f117fb2464b734c168eed3482987d7948235f7",
+ "lib/pygments/lexers/cddl.pyc": "7e3d2d00d2540294eba18249e078be56ff3b5fd99653787def337b94065cb69b",
+ "lib/pygments/lexers/chapel.pyc": "9ccf29433881a4c86f740402b4c789411df6a75a21951e86bebe389824907cc8",
+ "lib/pygments/lexers/clean.pyc": "dbf57b455059b193dc4d4223ef92e8e75aeafaba64f1c0dbecab2246a4f26d57",
+ "lib/pygments/lexers/codeql.pyc": "b96d8b078ba46c79beff601473d2e9f2af25da9a97d4db70fc5a0ed3be146781",
+ "lib/pygments/lexers/comal.pyc": "a714cc489461285f872ebce8b57a1b13fe90b233ccda793f472dff3d7865a877",
+ "lib/pygments/lexers/compiled.pyc": "94907caa86f6b8b992e913bd2dede36fcd3be9c36663755714aef145d708bd0b",
+ "lib/pygments/lexers/configs.pyc": "fa89debbe3d1b2a970dbcf80fdbcb56d4d4ca42d668eefc074b3a2b36afc6fe9",
+ "lib/pygments/lexers/console.pyc": "f1e480e30eb45bc71903a203ab498b70315c81648cde93ec764c766636f414df",
+ "lib/pygments/lexers/cplint.pyc": "1fbe8123e017c1470f918c3a6f9d471583eb4410812a4b1245b4bea2658afc96",
+ "lib/pygments/lexers/crystal.pyc": "b60210b4ee29b6b5c96197e7eebb24d468d9ccedc818b294ad3f0315f291acdf",
+ "lib/pygments/lexers/csound.pyc": "f5a16e555ec43a3e1c83ab74486a7cc4b4c212b97f9841ec334361c155d8fa67",
+ "lib/pygments/lexers/css.pyc": "4fa718c2e58c0abc915775044c78628ac23f0e114e4861c5d679d114f7b014c5",
+ "lib/pygments/lexers/d.pyc": "bd6b540b11ea6785f601a0ecd0a0fc72e7848dd62f2d86d8124d627bc805fcc5",
+ "lib/pygments/lexers/dalvik.pyc": "af1a7a61a2237d365ace5aecb72d171b3ce97fa1194378efdb8400d2420ca35f",
+ "lib/pygments/lexers/data.pyc": "a0a8af53a01861ddd1ac3f99145d7a925950ef3d8980426ad40f872623a36da8",
+ "lib/pygments/lexers/dax.pyc": "b374eb6562f8c929f892d1a0316b6a11383efc8531e7e9da1a33ab0fbb838364",
+ "lib/pygments/lexers/devicetree.pyc": "ad42651a351d7d660a886817b8ece765779b504d1f0cfa194ebfe9bc5585bc61",
+ "lib/pygments/lexers/diff.pyc": "de4a8b93428125db609fbc821835c95331da0411a4923a7c9dbabd7bda6c2abc",
+ "lib/pygments/lexers/dns.pyc": "8cd75d5c6aed5af3913ddcaec0b38e04c7fd9c601b490ea7cbffdad2a649de5f",
+ "lib/pygments/lexers/dotnet.pyc": "7e89638461961792a10082a75b830f5bd5f8983a3ccce886fb7453045cc0d0e2",
+ "lib/pygments/lexers/dsls.pyc": "aa086b315bce8d415dc9dd3bc17f3d7e2f7e2067eb3857897afcfca524aef0d8",
+ "lib/pygments/lexers/dylan.pyc": "a83ff9022e6ae7df4224b2bf0ea4caa36c63e1ce7e6472565b90e8d26f12332e",
+ "lib/pygments/lexers/ecl.pyc": "6a505b7739cd00882e25c002adfe925e06039c51600a1d681d68fe0e1a315fc0",
+ "lib/pygments/lexers/eiffel.pyc": "ac927ea80a408a67cdd3bda76a226b6c0a31e66378947ff1a651a8ecf43efed9",
+ "lib/pygments/lexers/elm.pyc": "13f30904debe5d1bc5eeb7b2d951020d2f43fe8a96be0e8d1b67193f5e65aad9",
+ "lib/pygments/lexers/elpi.pyc": "cf289e5754bcc7eb751de1e5819220aca050a7cc6d485a2513b6a2f1d0b7fe99",
+ "lib/pygments/lexers/email.pyc": "b3cf41403a5d43084a6635ccda0b015d4b87ea3f74b73d30d4ed8e618464ebb7",
+ "lib/pygments/lexers/erlang.pyc": "3638764f4ba72a8c5c20922da948a621cab8fda44d6cecd081460852a296d889",
+ "lib/pygments/lexers/esoteric.pyc": "39e5ae37f36d1c49322885831e1a8530eb8f95f223ac1692271f741dcb6857cc",
+ "lib/pygments/lexers/ezhil.pyc": "d176007596a437ba1407832806e9b47f0cc714fe89a8b290f912fc5fc27245fe",
+ "lib/pygments/lexers/factor.pyc": "23a03b64b12abc55c97db5bdecbeb71bcc49493711edbfd77e40bf3f7318b064",
+ "lib/pygments/lexers/fantom.pyc": "be566686da86aa742830a643bce2eeb4aa756e762b2d4a1c5df5fa1d0ecc0f37",
+ "lib/pygments/lexers/felix.pyc": "3ac48964f52c11f52edca2db62a8c77bbc4ddef29b1f13771a8fb085cd1d9a3c",
+ "lib/pygments/lexers/fift.pyc": "3021b780914af4020e376ee0b5de28124fe680dec7aebc947ad5cbe02067c1d7",
+ "lib/pygments/lexers/floscript.pyc": "70dbe361612ddd398b61c56a81946a45e49969d996f4854447918e7cdfe07e4b",
+ "lib/pygments/lexers/forth.pyc": "e79df4df74df55fc3496d150699614a10d69a862b11f5b2af55538e3f908725d",
+ "lib/pygments/lexers/fortran.pyc": "a24994fc5bf975fa49bdf16672cb97e13900cc4e57280b13a42f14f857647042",
+ "lib/pygments/lexers/foxpro.pyc": "81aeb60ba07ab6dab2d0ed7040847236607b3ca2050861c6adfc81aeba2bbee8",
+ "lib/pygments/lexers/freefem.pyc": "ac3936ede9ac2e6132a9b83c4e750b7fc0fe0806cc406189a4602b931f3ac1c9",
+ "lib/pygments/lexers/func.pyc": "5820e2cd01565bfe46f75f56d0ccddad766c2562e54d39a5e7060936e647e844",
+ "lib/pygments/lexers/functional.pyc": "5ba26042f6b5d9610131de9f9d395c406a7d43bdcacab008790bee992e9a565b",
+ "lib/pygments/lexers/futhark.pyc": "db3c893a5bdb90508bdaaa7be9d2cf41d323d4ecd09a845b3e5d808fdee9666b",
+ "lib/pygments/lexers/gcodelexer.pyc": "dd103ef3a227e73a6146249a32bef7ed0c42bbe91d3c289d280c71ad98f1ef64",
+ "lib/pygments/lexers/gdscript.pyc": "4fe48d3abde81badc35508874b1e931a53824dac61794b5b17e5f07deb9ef2c6",
+ "lib/pygments/lexers/gleam.pyc": "ba9d984982a8f371f4917968bd61a2f51e7550069f69dd291634fa27f5d87902",
+ "lib/pygments/lexers/go.pyc": "eae1ea4824a43123ce2aa5432152a244791d8dd81420b9a257d4d66b4e427c44",
+ "lib/pygments/lexers/grammar_notation.pyc": "2601c1e02242e54ce9a85380ab4b88cfadbbb4975ae776f27dcd7069280ec7f4",
+ "lib/pygments/lexers/graph.pyc": "dd3d6a9bee30f8ef859c256499e84dc1badbb9ea8981c57e879dea6dd28872f0",
+ "lib/pygments/lexers/graphics.pyc": "bb90df44d5dc961aaefa6bd57936891500fdf925c460a49fac79d66912340d90",
+ "lib/pygments/lexers/graphql.pyc": "c313002977dfa1ffac2f8b532db49151d672b792e2227afbeaff886bec3a75f3",
+ "lib/pygments/lexers/graphviz.pyc": "2cfd34a06c241859ff7eac281cf80994956023a0378ff8ec877a0ae9b668cac6",
+ "lib/pygments/lexers/gsql.pyc": "33dec19b0c1a5682eba49f32bf30c50419a359abdc84d181bde9f2bf5d24b284",
+ "lib/pygments/lexers/hare.pyc": "0eb6eb5e63904cb9ab496912070996778f0c07b8c8c563352ab15f9f83482fb2",
+ "lib/pygments/lexers/haskell.pyc": "edfda5771e538017ce0acd3452f6c1d8a9b86419111f96358d06d0d5ba7e1a46",
+ "lib/pygments/lexers/haxe.pyc": "e0999d2f208f9353d4865c04de2263d6552c881526c6ad1b0a0005a4aa90f8cc",
+ "lib/pygments/lexers/hdl.pyc": "71366a7e10c9ba627a8f7b69c7234358a7d847dee4337076ad80318bca32572d",
+ "lib/pygments/lexers/hexdump.pyc": "e214cbbe5dbb22ba97000c043cf5e9e4567629ab27a18050db609389e00fa935",
+ "lib/pygments/lexers/html.pyc": "d890aefd103facf2463c891b98f757bc51267265734195dfa68495a653b52ef0",
+ "lib/pygments/lexers/idl.pyc": "adc4ca59bd7c3e071e91b58257861e8f62a3a2d4905e31ec39e307b14d403661",
+ "lib/pygments/lexers/igor.pyc": "0e0b46b63e05fde21fd1f0213fc098ecae9e36b0d3743497ac75fe869e2d840b",
+ "lib/pygments/lexers/inferno.pyc": "3d494ec221110dd5884d869b486d26dadcc5a991aeee1396a06ae9c02ddac50d",
+ "lib/pygments/lexers/installers.pyc": "d743b46fa76f7525293ef1307e6d50930cffb03d35a972f909a3bcb102e5e23d",
+ "lib/pygments/lexers/int_fiction.pyc": "1dce33a1755b4913c7703388b07ee6965c0cca0bdf91cde8d26073d17c933aee",
+ "lib/pygments/lexers/iolang.pyc": "f650ef6a4e514748341a8e58cbbd61b48e2ff09e7d8d7237faee89d17b73cd44",
+ "lib/pygments/lexers/j.pyc": "174181bb34a5ba590e68997d8f81b1e07d2a8d5114d7c3e31f9e0cc3faf3ee6c",
+ "lib/pygments/lexers/javascript.pyc": "917680877c06f0c44ecc43e6ac320de7fc89bbb28c619300195b12aacbb2d734",
+ "lib/pygments/lexers/jmespath.pyc": "101bf280b6fbe08653171b911f790965b15c479e01f76727830100f61be0d729",
+ "lib/pygments/lexers/jslt.pyc": "6eb95e0949a7556334a1ef90462ce0fb49da5f7bf012a67a59ccfb806a768c8c",
+ "lib/pygments/lexers/json5.pyc": "592fc7b60fce48a5da865b227747305bb4fcbac19cb09b46e80be415702610ea",
+ "lib/pygments/lexers/jsonnet.pyc": "956109b808887c2fc5c96e96fd1edcb4be0b8fdbf6b84e728119293152acd2af",
+ "lib/pygments/lexers/jsx.pyc": "d80562937cc8a9363e3f5f4f159dbc320fd23636d51589bed673245042551b6b",
+ "lib/pygments/lexers/julia.pyc": "877a09cc1065d20133a1f52dcd88079156cbd24d1d0183341b1cf240492f29c0",
+ "lib/pygments/lexers/jvm.pyc": "0e57951f7b910bcbda9c8c07baca3676c5ffdbf66ac0e50912780fed8360bfe2",
+ "lib/pygments/lexers/kuin.pyc": "0031eb09637335c15a285af64d38390131204329c2643100975f7ff0773cdaa4",
+ "lib/pygments/lexers/kusto.pyc": "b6710324c5d5970f725426ed0681d24bae8ef886526d6742c4721b5040bcd3d4",
+ "lib/pygments/lexers/ldap.pyc": "a476f4772359401f990462281984e7a139917e81f492fbb01602ba48a4db78be",
+ "lib/pygments/lexers/lean.pyc": "9a07d876ab7329e3e94fa8d2cebcc69164d9424789c00397dca726313ad8487c",
+ "lib/pygments/lexers/lilypond.pyc": "3ce0a024a42b2ed483a35234d5d2cf0d9b3fe18c3ced601c799dfa3ff4aea1c8",
+ "lib/pygments/lexers/lisp.pyc": "33073f93f925677036d38807b7fa63d8d8c6afdc76bdd7b8b8e12f4a72f97aed",
+ "lib/pygments/lexers/macaulay2.pyc": "3182da4f6c777b3b83bae3e4bf2fb6893e0855ed109bc9cf6308b3726f1458a0",
+ "lib/pygments/lexers/make.pyc": "ec41fd5d142f1129c2c766aa7c756e6584d44fdcd3fb943b29a637900aaa4367",
+ "lib/pygments/lexers/maple.pyc": "fa612a8e3ef4357a6d954f8434632ea6f34034ddc4f381734907b571e0172492",
+ "lib/pygments/lexers/markup.pyc": "d20bee7947f224b36ab32aca17c5d65a112b76e21374bfae85750d98a6b3f571",
+ "lib/pygments/lexers/math.pyc": "ff261a684cd5463a23c03ecaffb066d46e958037e41a2280eddd5c894ddb53b3",
+ "lib/pygments/lexers/matlab.pyc": "1e3cc5ce24a29571894676a50828c9806ed7f0b4c306671c1e65cca16676a3d2",
+ "lib/pygments/lexers/maxima.pyc": "554495de03719660134cae778a1163e6c2dbc731b26b3c6ac99840dac1e47947",
+ "lib/pygments/lexers/meson.pyc": "8b54be2693142cec21f381d748e7f1ca0900a73d8e77cd2573027ea6420eee08",
+ "lib/pygments/lexers/mime.pyc": "4f95c0fa19004935ae6dee437c3025a43b86b0a9abd74ac752bfe30ca3b6bf80",
+ "lib/pygments/lexers/minecraft.pyc": "03d5aed4f491eec64d4e6b49442155565f63d0769f96cef068ce5cd62dca1be6",
+ "lib/pygments/lexers/mips.pyc": "39b9ef3bbf34c72e8929ad591a4a983add8282bd4d6581c19430b30dc426597d",
+ "lib/pygments/lexers/ml.pyc": "7308bfb04721e02cd2d16fcbf6fe38835dc70cf3b71bc60894fee5ff1b40f3c7",
+ "lib/pygments/lexers/modeling.pyc": "2cd720088d590c95c57e42a495731c3fb6f4938207e4ddba66c55585ffd99cfa",
+ "lib/pygments/lexers/modula2.pyc": "38d0bec25fe3fb0ec786fe73786166e867949a66dd29cccafe411d93064779e4",
+ "lib/pygments/lexers/mojo.pyc": "1693fb51d899b3b63228356d1eeb84d110819af9da7697b55775b1cea6934c56",
+ "lib/pygments/lexers/monte.pyc": "7f8484910c63b831a0306fd01c92a22b20816eb31ae4d6525c47a0a72eb69ec3",
+ "lib/pygments/lexers/mosel.pyc": "c2bba5971f91a9e78ac19a2409a1907645c82ab3ba28a3fb7cd7856a527ccc91",
+ "lib/pygments/lexers/ncl.pyc": "57828b5b2afaffbafbadc033bef0de78b6802d0e2463640322b42cbe8e3ccb10",
+ "lib/pygments/lexers/nimrod.pyc": "2cfc3f9fe270152ea1bc160371f0c276c4fca752f5a96fd04bfea12a134e1a07",
+ "lib/pygments/lexers/nit.pyc": "d0dd01068f0b7713916d62182976905cc233c358b6ce97e4da0d3242eb58e9c7",
+ "lib/pygments/lexers/nix.pyc": "de2dfa83bca937cb2f4dec3f60a6e45f402970c1c7e6f0492730b61ee788f25f",
+ "lib/pygments/lexers/numbair.pyc": "10ee71fb0c1645cbfdd661f6715e39fd720d7dbcab37cdea0f22f9c592c6473b",
+ "lib/pygments/lexers/oberon.pyc": "8f0a6787c0c2fa2366d5c9b74e665038d297b95dd8aa53d21c7d9da7ecc0267e",
+ "lib/pygments/lexers/objective.pyc": "de9b40c7be618345894fc03ca821b959a16a4dc9454e008e6efb8f66d26bd5f2",
+ "lib/pygments/lexers/ooc.pyc": "beea8e1a78d68d8d8b73ae105d96a2a321c56b7933592cc1fc50bc3cab2a492a",
+ "lib/pygments/lexers/openscad.pyc": "beac7cc089b94672aa073099c7afaf9f1531868769cc32d8895acadb4084a68e",
+ "lib/pygments/lexers/other.pyc": "43ee40f7a32ed6315bcfbc5d4a6e8f91d1bd22f074c7116e9f054295f276e6f2",
+ "lib/pygments/lexers/parasail.pyc": "cd960ed945c6cadb1a43cee0fe2be3be3c38631432fc81fbf93c2e78d4f4f8e5",
+ "lib/pygments/lexers/parsers.pyc": "8a25e19263ba993ab1d445a53da0c66f4b71e052567766c484c59740a539b81e",
+ "lib/pygments/lexers/pascal.pyc": "deedb191d998983ecefae227c5439677eabd33e2ea0742627562ee5a448d9221",
+ "lib/pygments/lexers/pawn.pyc": "cae92cd0a55c71eb85aa8283c65b82abd19a83b55a8d3d16742017f7e460c3e0",
+ "lib/pygments/lexers/pddl.pyc": "339566c1750c8142d480ee83af6155d2b627b2b98a7c667aa36d91316d5e9992",
+ "lib/pygments/lexers/perl.pyc": "99c92959ac6b60a7765ae7d7890757b66d00f6051657cf97aa1773263d86a30c",
+ "lib/pygments/lexers/phix.pyc": "7d39157ce03f8a59cb0adf391776e534df4157294cf8a5097241fccc80631f9f",
+ "lib/pygments/lexers/php.pyc": "aa76ce919a7b95078a6b42610ef93a2fc5204642e16ec0e7e13276ad4f1499c2",
+ "lib/pygments/lexers/pointless.pyc": "3e3fc200f0fc30683265a27efb3ab8bf81946507971e5d73ba6b533fed657355",
+ "lib/pygments/lexers/pony.pyc": "7360b15a8f248bdd3197e753f5d3c234e4f5d0436353336ec97ef276ce7be4fb",
+ "lib/pygments/lexers/praat.pyc": "efc8725184983376e79f73f56dd22c0c290dbc23b22cdfd042ee9fc9ffae5d69",
+ "lib/pygments/lexers/procfile.pyc": "b8bf107bc9127043f0337244da28f96565c7cfaf2993f8eee7523745eb54e331",
+ "lib/pygments/lexers/prolog.pyc": "b57caea117a2925641d68aeee7fae4131b884db31ce494536841153fe27e0e17",
+ "lib/pygments/lexers/promql.pyc": "89c0875b366a9ccae0c424dd8f3403d88cc629c0e708bd0d47b81ae335586816",
+ "lib/pygments/lexers/prql.pyc": "3a7c9772f329f53830fb89703d05ac7d50b172dfc5fa5f53ea977c7836570772",
+ "lib/pygments/lexers/ptx.pyc": "16d071a14633a1dce959e03c642277dc6976b0cdf17510998f96e445e8c0d690",
+ "lib/pygments/lexers/python.pyc": "3c5faa399ef7fd32a3e5b3ceb19723116dee92bc7921ee47e737a9b9160b6df2",
+ "lib/pygments/lexers/q.pyc": "12d4534c76d425a6a261497d1d5d3b7546a70c3659d183574ef77a616c5f18ab",
+ "lib/pygments/lexers/qlik.pyc": "d54e6e24fc0be9c89d4e05fd2ab60b9dab7b869ade7e54ff653577a4dd241182",
+ "lib/pygments/lexers/qvt.pyc": "5f4b3f80cd9d924cddf1b63769173ed7590c167514726c9d463818ea903d2be9",
+ "lib/pygments/lexers/r.pyc": "fbb49bc8acf21f3d95b2b56883eb818548e8b60fb5a6e004b43cff642170e277",
+ "lib/pygments/lexers/rdf.pyc": "44604565e5f697b0548338b0ec55f717705a0aa347a80ce5fbed9fe8631bcf91",
+ "lib/pygments/lexers/rebol.pyc": "b4e4d7318a1cf81c557b9b0702bf2b8d0431875469127c01ccff1fee2e66b884",
+ "lib/pygments/lexers/rego.pyc": "7ba53c5233426498851140d5691cbbb32838edb3a3ade47f91fcfb0ce0686ccd",
+ "lib/pygments/lexers/resource.pyc": "d1c42b1ce0bfaf30d902842fec064704ee573b0979581526cfe35c5039f38a08",
+ "lib/pygments/lexers/ride.pyc": "515926ccb94358c55c413f103aa8297cd28ff5053a16772c068bdcdbb0652227",
+ "lib/pygments/lexers/rita.pyc": "bb1d0c2cb53e69e0b12d172f472c8eb367655599785e847d304a9a4ed43babaf",
+ "lib/pygments/lexers/rnc.pyc": "4a442fd7c5d165dad6ffaac1676e43d0f4d13f0f4ba05583be2135719b0e6920",
+ "lib/pygments/lexers/roboconf.pyc": "9045d9eb73ec249b8164607fa46be8fb5c4495d8a0a3295108947bb47c57d543",
+ "lib/pygments/lexers/robotframework.pyc": "42fc83d222c604e7e80c64fcd6e2a5cd9a3e06991e9f7737807b196d70de786e",
+ "lib/pygments/lexers/ruby.pyc": "128c4e56ea3dc9704e99abe82afe4a37954a1443664ac4ca11f72c67bf6b6eff",
+ "lib/pygments/lexers/rust.pyc": "20c33564b2a112265b606a50c9240ca11fbeebf4f40314fcf8b9a765e2e150d4",
+ "lib/pygments/lexers/sas.pyc": "7659b73dcd77d1a394ff136ccabdfbe87a11bc6bbed64d3668ec995c19b4f31f",
+ "lib/pygments/lexers/savi.pyc": "0640c77f925f790efdbdbbd54435f43c8cc6361c8f60152e8a8c69562c8d9f68",
+ "lib/pygments/lexers/scdoc.pyc": "5e2045af5cb3fad48a546d377924a5cb4058cec9ef361235c680d4a180f61cb6",
+ "lib/pygments/lexers/scripting.pyc": "f9c0df9a28c6c392035f19bcd30a3e6f3c80916df04f2388991c210b0eeb7c55",
+ "lib/pygments/lexers/sgf.pyc": "8f8ba4a3d554fa0217a0eaddb85c35f12b5a5aa5ec75e442b97f5c1355286b5c",
+ "lib/pygments/lexers/shell.pyc": "c449c93339081042ba059267a278dcdc264ecda4c49d1f80c5e60dcdf17f2343",
+ "lib/pygments/lexers/sieve.pyc": "52b8ef77a6704a8386c0926b7a9d9204e6ec17af43cb783d429f560087319266",
+ "lib/pygments/lexers/slash.pyc": "982bc4dc9cd3b742dfb3798bd258cfa161b8fa4ba662c6e7791d194bdd8e3266",
+ "lib/pygments/lexers/smalltalk.pyc": "e4f71c18b408e396f849ef4ea26424effbf0fcbe4a0cfd45c340d875de53fa48",
+ "lib/pygments/lexers/smithy.pyc": "cd3ec90648282b60b6b2be23c53052802d2ca87822e1ad145c61d72fd794a63e",
+ "lib/pygments/lexers/smv.pyc": "cd1866a3ef2098ed49018ae4747c18bc9664062acbf223c1efe2d71f97dfb693",
+ "lib/pygments/lexers/snobol.pyc": "d1aea64086c125ccabca0b044c8c53ecafb150698458bea7fc636f4377b8d883",
+ "lib/pygments/lexers/solidity.pyc": "cc26c2124867de42609f46c6652d0d6feef46856a375af4186de9c9b8063a30d",
+ "lib/pygments/lexers/soong.pyc": "1b33a57d56bbc5d324e419df0fc71a93bef3113c9eed50a9964ab7f0535edf36",
+ "lib/pygments/lexers/sophia.pyc": "d8eeb0267cd333acec6aa8371e8e8be9494e4d32b7dabf6b4b5d0bda8cf79a72",
+ "lib/pygments/lexers/special.pyc": "d4988c3de7ad48410e526f101f0311b190d65c3c35b575ca273f147e1636ab7c",
+ "lib/pygments/lexers/spice.pyc": "f919a9e3b53a8120c155c57024437db9d01b11e582fb2f96ba2f08c0e6aafd96",
+ "lib/pygments/lexers/sql.pyc": "607df824829fa7d6db480bd326cee8d7615fb4481a0eed58303e71040ba2bcb0",
+ "lib/pygments/lexers/srcinfo.pyc": "a66e28b31f48ad0f49ec89be9f7471dc1c2ec94b1b771219a09328c87eb71c84",
+ "lib/pygments/lexers/stata.pyc": "2d2deed9e373ec56b869a319da17364a5e74b8e8c1919cd9ba57ee6da0fee16e",
+ "lib/pygments/lexers/supercollider.pyc": "8470700d76c43d491f8721afb9738d9c21af31fe86a0fe3588db3a5bb6f30607",
+ "lib/pygments/lexers/tablegen.pyc": "d160eae5eea865ce4f4fda6726c6780397c018737dfe94bbf8913329584314d7",
+ "lib/pygments/lexers/tact.pyc": "b7282ac1127ea536098172d817ca41946d70b18ed8a3cf3d42f4e57dc43f4022",
+ "lib/pygments/lexers/tal.pyc": "573611d783e7b5c52acc722eaa1833bd4df113f8357d95563cd81b2da11606f6",
+ "lib/pygments/lexers/tcl.pyc": "66659678ee5e3f9fb36542644be49a81df7ffea1596b6aef86cfcd1c41a95bd1",
+ "lib/pygments/lexers/teal.pyc": "f2f2ece859954cf38b5c80014d6723bbfd76653209c2586eb7c03f78aa794b09",
+ "lib/pygments/lexers/templates.pyc": "e072866a9ad8c7bad71c832e02f5713600cffb9bbc50d31481ec365dab697be9",
+ "lib/pygments/lexers/teraterm.pyc": "077ae49146d08177f25b3517c289aa6aad424f744da1e5abc285438aa67d6b33",
+ "lib/pygments/lexers/testing.pyc": "bf62cd830e28737bb54f1fc298ac0b5f1f01ff6c85509351f6d62a1b4628df97",
+ "lib/pygments/lexers/text.pyc": "5993fe7e00da73c09a6d01887a85cb125da693ffaac277f6b00f04db62e83827",
+ "lib/pygments/lexers/textedit.pyc": "81789e5248302c63774c0bd57df0def597620f67467c8dcebcd6b5b09bedbc06",
+ "lib/pygments/lexers/textfmts.pyc": "e0c3b754961298acba793162f47c6a552be9defbe6a5accc3d7b73e621d093b9",
+ "lib/pygments/lexers/theorem.pyc": "e6f8649e9d66f61212d3af5055a707824f001de9eb9212288c2e7e36f616a756",
+ "lib/pygments/lexers/thingsdb.pyc": "41e56e4aa9be5758aa2665df6893df8581a5a039134329b6123e8740cee8ca33",
+ "lib/pygments/lexers/tlb.pyc": "eebdd5f0f3dc8b0bddada38f2f49a168a642ae477e008ecf3209c9e4e6aa9d2f",
+ "lib/pygments/lexers/tls.pyc": "76b0b7c072fc2168c1efa3d1451695d2dfb2070522b1881073afd6b3970063b4",
+ "lib/pygments/lexers/tnt.pyc": "1e9e0fdbfebff9a0e48c852cb02583e9aa593e31c2ffb5263964c0551b407b79",
+ "lib/pygments/lexers/trafficscript.pyc": "12a161d2679b0c6b96628d5c782d020f15c8063745cf78d47dd28f17f1516b78",
+ "lib/pygments/lexers/typoscript.pyc": "65e700cca453d35810e2f81043f4a9c20151fa9b5dfab10b580f06b51fccfacd",
+ "lib/pygments/lexers/typst.pyc": "118de752cdb054f17e17451e7349587292361ae6795431de200bfcf43acad4e3",
+ "lib/pygments/lexers/ul4.pyc": "27e69568b894cd9f2281ce604a1f917455b15238c5f07bdf724a2dc40201c4b4",
+ "lib/pygments/lexers/unicon.pyc": "896f2d8113aab9bb88a45a1aa894ed112685c99ef7b846aa850df5b1116a6616",
+ "lib/pygments/lexers/urbi.pyc": "730139cd21ef6ca12a303ef2281bbcae3f8c776f14877b926eb95d4d8f5aee9e",
+ "lib/pygments/lexers/usd.pyc": "adac22274582195ccd6c11cdef3b4040e00ce3801a642ccf95fb092843e1abe5",
+ "lib/pygments/lexers/varnish.pyc": "971ff01dc8e9be30754d73cf06af6af558c28560d68b7ec9e47c80f28e0f965a",
+ "lib/pygments/lexers/verification.pyc": "7763b819046a56583e23b85d6bc7710edb2e57497b7b20857112e6cff6b30027",
+ "lib/pygments/lexers/verifpal.pyc": "a0e508d5f867c7f1e47dae4a6c8c62ee392deef0f0f236fac1a5dd0883966ecc",
+ "lib/pygments/lexers/vip.pyc": "75072158c90a83e21b0cfda9a55b89c0c378366f0fc1debe37add9f323092307",
+ "lib/pygments/lexers/vyper.pyc": "119a51d8bbcd421ff95d1d4510a5f03f75f28a3f680e44ae62b89da442a387b3",
+ "lib/pygments/lexers/web.pyc": "40528dc8628863b79c9d694e2a54e8578f1f3a7466a0106b799748831efe811f",
+ "lib/pygments/lexers/webassembly.pyc": "7bd38cf832ef1d6612f27b3f2dcb964dca8cb047d2409ebff5666b66acbe9789",
+ "lib/pygments/lexers/webidl.pyc": "9bae1e3bc99814ceb921127834ece866d4d48f523ff8e4ff34d10c347ee9efcd",
+ "lib/pygments/lexers/webmisc.pyc": "c70f72b2488a16a94720f998303498a34e0a3e2f66c04df9f631757d4bdf0468",
+ "lib/pygments/lexers/wgsl.pyc": "0c5b34e22d8caed74e43a09daff62eb07e3a7318ca977b0d0cdf3e85bdc33b38",
+ "lib/pygments/lexers/whiley.pyc": "85e0fa3c6e20a858f60fdace249090a035b1a6e7ba2a9bc4a5466887f0aa22bf",
+ "lib/pygments/lexers/wowtoc.pyc": "b21cb21e9491d75157323d7e766ab2e0623bf10aa5e6682ccb6acc6434ec7dc3",
+ "lib/pygments/lexers/wren.pyc": "dda78b34f142587c6d7255423a97e12c51bb490d10c9d999f4d8624dab58a1cd",
+ "lib/pygments/lexers/x10.pyc": "90f7cd173cbb1d1060adb68941771baf42a711f67113a347fe8cd5ff2ba55c77",
+ "lib/pygments/lexers/xorg.pyc": "c74348acf2aac1e252ced0dff2242919ade9bd89394a7f474cd2f10469ad3d3b",
+ "lib/pygments/lexers/yang.pyc": "68ab87d2141138652185dc6020505e8e3e08eb253f8a18ea2e79a8e67727d540",
+ "lib/pygments/lexers/yara.pyc": "5e655a029b1a7c5a812a69decc1c24cde465cddde3b5a99af469ad821ceb31ff",
+ "lib/pygments/lexers/zig.pyc": "4fded76dd26680a4628d6bdbafc54f9af0405efbd276ce68dd1a5c70b3b4e2f6",
+ "lib/pygments/modeline.pyc": "ba459bd2aa7f96d4fe85690d8921829e12c82dbae06821a773ac6f65685b7fe9",
+ "lib/pygments/plugin.pyc": "53ddaab480758029d4d76ff8d7238a7089076a6ae827bde919d63fd64569c145",
+ "lib/pygments/regexopt.pyc": "f2b1abef7f0a9c02707217b228f593ce1db697ad6751591b76143dfb329d5572",
+ "lib/pygments/scanner.pyc": "89e298671ae67106958789af2e0deb19d0524121c525707b4dd2a5f57be0c3a8",
+ "lib/pygments/style.pyc": "5a8bf5e1e1aab39d2b7ec2b5e33b1a1bcabce24e1794228a832db745707287f6",
+ "lib/pygments/styles/__init__.pyc": "9a59c5b2e2c90ba0f89e60db835d4ae831a3fcdeb6c9fe05369576aac1f1feed",
+ "lib/pygments/styles/_mapping.pyc": "7df16480621475153a91eb6bae020db954caeb1be49fa75c7bcb3899afae43fc",
+ "lib/pygments/styles/abap.pyc": "4ccee759016a004b32e22bb67206197f07960f83f8821e4591c96b828c6ee09b",
+ "lib/pygments/styles/algol.pyc": "2f435ebd228d779faf8c7132928b517a7fb3e9bdff240c8dc23ef452586c7e3d",
+ "lib/pygments/styles/algol_nu.pyc": "ee1a450874b09a64a8ffb25f3fcc9c0633f3dd75d765481af561810b02dd83f2",
+ "lib/pygments/styles/arduino.pyc": "98534178895b7e903e0dfb53fa38d1c317707db40f6b70ce06d440bcdeeba0a7",
+ "lib/pygments/styles/autumn.pyc": "b9be352b04191bdc4ee66690cf48a4d871fbebf6bf06073c3d91e585a1b1675e",
+ "lib/pygments/styles/borland.pyc": "975e0fd524367b24ac1978cc6ca4e87ca35009d9c3a0e34b4560d2ee4642a07f",
+ "lib/pygments/styles/bw.pyc": "f1ebe82a20d05fae48a3d15385aa29e02523af79858950325493619b9dc2859a",
+ "lib/pygments/styles/coffee.pyc": "6d6e55f573c4e1b665d571f4a8ab1c189a37a4c1610901b123eb878f8ac0fb29",
+ "lib/pygments/styles/colorful.pyc": "59daee01b22c75bc588485d6a788dffed3343793433b5304bd15b546ae69178d",
+ "lib/pygments/styles/default.pyc": "be4e8977d98164ed38b82bcc29b3c0dc7ff8e17728ae32681561a36afe42f638",
+ "lib/pygments/styles/dracula.pyc": "2dde0795c55a701cde1f08b6884b1bbe0269efb599713ddc3ed513f6c2c16eed",
+ "lib/pygments/styles/emacs.pyc": "07cdee61cb10eee5ef5d3f3d7dd233bf7ba04d048aee072e54726f077a12e045",
+ "lib/pygments/styles/friendly.pyc": "7a39cd440c3cc56c2cf9e7ef9ede06f9bef428b6365464b12245ba26dda842b4",
+ "lib/pygments/styles/friendly_grayscale.pyc": "96052ec1b758ed983ef124c778365d7b3fbb3d9121704cf69b27711431e968ab",
+ "lib/pygments/styles/fruity.pyc": "aa46a70e52613eebf66bc935f8d9e11ce6cebc32590a295aed8c66900dfe0eae",
+ "lib/pygments/styles/gh_dark.pyc": "f2f2293c033489b0ffbc8535a00fbaefa17b63c275430617bd89629cb5aaa4ae",
+ "lib/pygments/styles/gruvbox.pyc": "c5f342da64c3cc449ac9861f305cf37ed39ad0828cd48e4944ca3d65d10d838c",
+ "lib/pygments/styles/igor.pyc": "ce16b81758f470b52488ba8bcccc56a0a23e0f9e25d6abdad27765ade93936f4",
+ "lib/pygments/styles/inkpot.pyc": "466fc6ff696eef6e8cc3a0322f6da0b871b8fe00908c5a241c039264c100172b",
+ "lib/pygments/styles/lightbulb.pyc": "50e0cf90d8b32fc2fc3112fb2786d4c383c342d6abfac04d1a386b0509487c54",
+ "lib/pygments/styles/lilypond.pyc": "7fdb4121a8daefe8f0e78110e3af0700039e24a90aa9670ce871c9b6016ad906",
+ "lib/pygments/styles/lovelace.pyc": "2c219893a3f6af15d08d45e1a69b16d779703b283b8ef31924a7fc99cb956171",
+ "lib/pygments/styles/manni.pyc": "82b7f07793c1ca63be72213a0f3965153c4a7aa9c4928665f4403eeaa0a016d1",
+ "lib/pygments/styles/material.pyc": "4fb375dd8a859df490974beeca089e1581ec6964d7d72fde444f8694bf7403c7",
+ "lib/pygments/styles/monokai.pyc": "781e00630b860bc44fa0451028cc671eaf8ad2f47fc9d9592598092811b09160",
+ "lib/pygments/styles/murphy.pyc": "effeb98b152072244bd089abc21dc06b425068892dc6863fa9a455de66028884",
+ "lib/pygments/styles/native.pyc": "e343433e83c6dcedf538cfe41cc15b8344a0b83f47f4223955af903e8a4d3edd",
+ "lib/pygments/styles/nord.pyc": "082135e2fa3709f5f54dda246c0e5fe7c380c134e7dd5bcad4a68e9c032dbc34",
+ "lib/pygments/styles/onedark.pyc": "6e8e784bfb4d0f4b04f59c9c079efd195529e2b3f836ea702872538b5c18ef08",
+ "lib/pygments/styles/paraiso_dark.pyc": "5dac4575c6467f4d10fc2be87cb7c0c275d5b120cf0080b73501794cc43f927f",
+ "lib/pygments/styles/paraiso_light.pyc": "89dfc2bdd82b0cf1043027815d5632dd89fe668c3e40960038b35ab3acb9ba82",
+ "lib/pygments/styles/pastie.pyc": "1818417180b16f3441628aae24bf1ad4ff8ed44941bfd8631759ae65bed67c49",
+ "lib/pygments/styles/perldoc.pyc": "cccc530ec77e14322efe4e841ec407077567d6cc6f201e6109d5640f5d781a56",
+ "lib/pygments/styles/rainbow_dash.pyc": "779b9f75a21d8ccec5ec996791af5c6dc11a4955892bae548e9f4ac2dc261164",
+ "lib/pygments/styles/rrt.pyc": "317ef8433bda7f79fb6088a7a54eea8a25a847a55fbe4ae77d19e959f5be7143",
+ "lib/pygments/styles/sas.pyc": "e676820ef7d9a53d3312efff9ace4aa2e8a5c5caef9c91024c4a60d54af3cbb4",
+ "lib/pygments/styles/solarized.pyc": "45433f924900b91333a1e0cbdbb8270ee841a449b3d19af333fadd64172c73c8",
+ "lib/pygments/styles/staroffice.pyc": "08181b9ff8ca1485009b6f026d9db02580fc25ed89773bc1d6f6af323cf5e238",
+ "lib/pygments/styles/stata_dark.pyc": "0a9f11f8ed91e78a7708613ab45d1bac3f3d75583c47ccea810cdfc8b189d1f1",
+ "lib/pygments/styles/stata_light.pyc": "b25e5a9c1fb78d1daf2e067c41a47340c7dfc3f3b489195c13e7238a83451640",
+ "lib/pygments/styles/tango.pyc": "ba374428faf52afd87a9d5a745f5de115402e87cd0e3fba1297c47d8467e4565",
+ "lib/pygments/styles/trac.pyc": "c4e76a05d990264a3c0f8bca55fe90cd013eeef32d3bd2d9ea2cac80d43318ff",
+ "lib/pygments/styles/vim.pyc": "56938d9764f99c55225b583bb08ed23cc0a3f7756972e39ce11ed16a9f661162",
+ "lib/pygments/styles/vs.pyc": "4cfbd2474613604e447f0a5aa2cd4613e9efc88f0dbe3c89ea3330b0a4313e55",
+ "lib/pygments/styles/xcode.pyc": "535e3d1cf8c2b4f2bf98f0ea4acba81dff994027a9284f0d06c6ce345f89b60d",
+ "lib/pygments/styles/zenburn.pyc": "d216e6e9ad4643f211872edc5c187b4097ce8bfe26000a6c65a7c9c4ae61ad48",
+ "lib/pygments/token.pyc": "27102b77d137a12305672c4d959577d871e5da2a9e569b2ed6179668f5cab715",
+ "lib/pygments/unistring.pyc": "fee0a457a1b6ee9b91a9e57b7081465c4a7c2ba78af2ab88e076c0e8050f7b16",
+ "lib/pygments/util.pyc": "376df479770020d4ad44fa61519960516d6634da75ea0ca72285230396cd2f3e",
+ "lib/pytest/__init__.pyc": "c2d5099aa30e291fba7363a99baf446376743fd53b5f8f83aee5f2181055bd0b",
+ "lib/re/__init__.pyc": "3a407d12f9616cb6911a29456faf011240bc5d6378d4b94404957873a7dcb000",
+ "lib/re/_casefix.pyc": "02e78c3d009e72dcbef654fae8bea54c59bbe9d4baddff042f2eb6c87d58e054",
+ "lib/re/_compiler.pyc": "0b8d43c738cd4256e87347a2ae8b47e327989747c3f7506b0319c565a875d435",
+ "lib/re/_constants.pyc": "73523153af3e0b937008cad887350a5ec6435e8f6efb9e3c583f7ebebbf3f50a",
+ "lib/re/_parser.pyc": "80279ef80d1b8a50217ea94d5ba7cc6247d7e07ca92fc005a7f624fa1b4941f7",
+ "lib/readline.cpython-313-x86_64-linux-gnu.so": "59f59527db9c68f4ff981f06853718ea2fc0b919a8842370aa7481c00a0b02f4",
+ "lib/requests/__init__.pyc": "b5165f152f973f2640cc56d752cc952215dbd708e3a67305850137bd66d1e59e",
+ "lib/requests/__version__.pyc": "1903b1d05c5e6118e03c5bcde75affe49aabc71271b8f55876f1bd4560f1cb71",
+ "lib/requests/_internal_utils.pyc": "6a8743125cd650cf05a8626e42a234433849c3c2a476cdcba658bed4981a9e82",
+ "lib/requests/adapters.pyc": "ad7863342c71c41b27ef21c6433b8671089c7ba0e4c7e524845b70a4bd078279",
+ "lib/requests/api.pyc": "8b599a3a7860d9135c91066da5a68899567b43154c5bb69230487f9d486e5d92",
+ "lib/requests/auth.pyc": "387c72696c764ddfa89a586f6d6982e273f1b1405f8d7d706fe87ac37acd325f",
+ "lib/requests/certs.pyc": "cfb1c3cd724d1f89fe8c0853dc9c562103736413130ef8efa082a2ddd91bfc19",
+ "lib/requests/compat.pyc": "181ae9a66175f9a0053059512ae759f88e07eb82acaa90d2c805d9dcb0aeeef7",
+ "lib/requests/cookies.pyc": "8f1a4aa71252af2ea581c86dd965e780bb1ab78bc1975e076c982e79f33a2c3f",
+ "lib/requests/exceptions.pyc": "7f0eb7d76a73be91173384eb7bb6cf0f4cba0171fe82de50e8fb6f4c70b29b93",
+ "lib/requests/hooks.pyc": "1ab73abad163b658d1c5837e36d1072f033fd9c8e10934c74703f7be078ca5cb",
+ "lib/requests/models.pyc": "f4d19f985b014fa2508a817aba4c4d2f558e034c3fb3faa3edd9ea80e87e829d",
+ "lib/requests/packages.pyc": "9d450c2b40137a26d205bc892808e312ac9f562e342f5f878ed5d2827747db7d",
+ "lib/requests/sessions.pyc": "66b407787616a7c51e05a06d3fa53b2769a92a4c89049f269ca92e637b57da06",
+ "lib/requests/status_codes.pyc": "76b9fe4a47ccbfdb2d8960da0fa505085828005922384203029d38883b10be9e",
+ "lib/requests/structures.pyc": "3a61bf0370b2a02e7a62f3f598ae0480fa8308a95437fd08cab10153d3d3b39c",
+ "lib/requests/utils.pyc": "858f4e2155206364cd2dc30140be8704f97e9097250127261cec3cfcc6b68d98",
+ "lib/resource.cpython-313-x86_64-linux-gnu.so": "8650429cdfe5f5f25b4f79cc417e884d2b21a5f1c14a1c551d54726d92a9f3b1",
+ "lib/select.cpython-313-x86_64-linux-gnu.so": "5bdedb878d89bf28ae31823fb4095cc980b6ded6c85219dcd4c9ee93a11ac74b",
+ "lib/serial/__init__.pyc": "52532d425d86881b9afcea2fde7b84d29427c1a20d618dfc22edae7d7fdf5b9b",
+ "lib/serial/serialcli.pyc": "29abae3bc7e0f2b6409238c5aeed4414fc3b5276631b5c1afa08e80cd4c20b4d",
+ "lib/serial/serialjava.pyc": "c25175a69320c9a98db4d0246864bd8c939c15aca07dce11cc4ff014e45ceab7",
+ "lib/serial/serialposix.pyc": "94879a9c029fa2e3d7a5767f621b6c06060e6014784d23058174127f44e88eb8",
+ "lib/serial/serialutil.pyc": "fe8cb01c8af4fe784bb9b8349e80b9df2c6e07571610b1a27e48f332d6345541",
+ "lib/serial/serialwin32.pyc": "2cc86319022e613faf5e8534b4b9d86c2c4febe393042bc5a0599adc4899ed52",
+ "lib/serial/tools/__init__.pyc": "0db24b899b8c19a8ffb4816a8279b9916b7c0ab52ac5e17270fd8990aca952d1",
+ "lib/serial/tools/list_ports.pyc": "e7fc848f99c390fc498d00cc1543185ff2a6b69f16ed995717194fd58594a52a",
+ "lib/serial/tools/list_ports_common.pyc": "c53bf941bca86d19dbda2e2d030d28346d128fa6b993d6b1ac818beaa7e6547f",
+ "lib/serial/tools/list_ports_linux.pyc": "15861e9fc15b48db2b101a9feb3765f41a799b30afdd5afb8b655b73f9069ee4",
+ "lib/serial/tools/list_ports_osx.pyc": "67a72ec870186e62cc7c09221b08326819676f49886a41249de95628573d9f73",
+ "lib/serial/tools/list_ports_posix.pyc": "84e2a24762064963b0d497a8aa8fd8b64cc694231dc3814389dff1458785a31c",
+ "lib/serial/tools/list_ports_windows.pyc": "e95dca00b3e408dab2a73d723b8513d5667728b1f9762ef64b4caccd08de8be9",
+ "lib/serial/win32.pyc": "f01bfabbf392d9f232a29b62e804c649c96b6f664455b7b0a299e7cde3b43b1b",
+ "lib/setuptools/__init__.pyc": "2a500b30ef0c1da620ff957819577f5335f0d04b3a042ba4a7fae21427b2db07",
+ "lib/setuptools/_core_metadata.pyc": "3bfe6ab2fe067bf402b0efb49d255326ac9a20495915d5d3154ac3a05a136c35",
+ "lib/setuptools/_discovery.pyc": "3a3026427dfd87c2a1efde4f87fcfab32cb9b8abf0c494446a975f62ed8c5821",
+ "lib/setuptools/_distutils/__init__.pyc": "5d6b1fc56dbd85a39e5faea0a99726a8e9644c2857177c429eb663d89fb592b5",
+ "lib/setuptools/_distutils/_log.pyc": "3ed66e4138f22c9554ab1cc0cfe468a9a780763682b8495383a22bbcaba60e1e",
+ "lib/setuptools/_distutils/_macos_compat.pyc": "a35ac44813f4e8f7b6232db77dc278a9fe4ccc23ef2bb775153d6a397e83deaa",
+ "lib/setuptools/_distutils/_modified.pyc": "f8ec04d5ffcec4b2e203ebb5e7602ef1fee3b931cfe880eeeb51f9910fead4c2",
+ "lib/setuptools/_distutils/_msvccompiler.pyc": "3491dec42373a3301da6e2da247a070863592916e24580e4ccf2292c9c43d3a3",
+ "lib/setuptools/_distutils/archive_util.pyc": "165dc6d93ff7a8da8f75b78755a5559cb387c840de5af41c6b590e951cb55b08",
+ "lib/setuptools/_distutils/ccompiler.pyc": "517aff4705c920669387a61e5b34d689c079e84d9280592d2ee50a16928a5433",
+ "lib/setuptools/_distutils/cmd.pyc": "08a3f84cf751293802e847fa2d9ed295354b3221d09daef18044a40d85381bb3",
+ "lib/setuptools/_distutils/command/__init__.pyc": "2d075e3f21da0c4d471ed47120bec50a0b35205eb3cfe0e4fb3f514a851d4ff0",
+ "lib/setuptools/_distutils/command/_framework_compat.pyc": "678b01fde295ac6590bfc5af7be15263f37506df5e17f930fc709101afa958cf",
+ "lib/setuptools/_distutils/command/bdist.pyc": "4a20601768f8edfa314fd206b14c8091b7725332ea0754fbb04ee6fb0e93e25d",
+ "lib/setuptools/_distutils/command/bdist_dumb.pyc": "f7403b134d695016dcd467fd91b5ce0a8456be99d55a59cdf08f5992e4db0b22",
+ "lib/setuptools/_distutils/command/bdist_rpm.pyc": "9f4564a5d973e75775341c57befaf3aa9b21d3f10cb4e87d482a574f2e7eac76",
+ "lib/setuptools/_distutils/command/build.pyc": "f8969465559a49fe4fa7baf6b81e206c6970f98fba09e57bb22c658e8af49614",
+ "lib/setuptools/_distutils/command/build_clib.pyc": "a573ce90df61c81cc7855ad7cd601f9157782acdd3840546dfca0491281f95ec",
+ "lib/setuptools/_distutils/command/build_ext.pyc": "f5d330923dca3c6aa34422a3de713e68f82aa0322b39e772b9a410c55d3ff52e",
+ "lib/setuptools/_distutils/command/build_py.pyc": "ac4931fe785d2636b01f9b81e851b04803e7b85c3caa679e13b2e3501a5a5c00",
+ "lib/setuptools/_distutils/command/build_scripts.pyc": "17986ae879004f001c6d66d418b350d2714a493b58be066436b3d0dcb8dfbf4a",
+ "lib/setuptools/_distutils/command/check.pyc": "4722e26b78bf1b838550346b785d6d74481420bd49f5b052567b93a2260b79c4",
+ "lib/setuptools/_distutils/command/clean.pyc": "d2554107c51c85aa857c6c86645c78419a6689ed8a768b85fa96b12de50af052",
+ "lib/setuptools/_distutils/command/config.pyc": "4868af24fac22ed791f9bd52e8560a582872348b6cc1bf4ab69f31e7fd812181",
+ "lib/setuptools/_distutils/command/install.pyc": "4bfb5e0e58f8c818d9716da62819884e2bf2a9e2fd05d301f4648b2ed4d96027",
+ "lib/setuptools/_distutils/command/install_data.pyc": "ff8599f6d06b00ba99f8aef9186f71d537ab5c68d24b5453126c69c28549702c",
+ "lib/setuptools/_distutils/command/install_egg_info.pyc": "7475123707219c4c753bf62f65c9d3da45f8bcc5940fac1fea8c58479201a4b9",
+ "lib/setuptools/_distutils/command/install_headers.pyc": "27b1eaa5eb7d751905506275b0d9499a8069a5544bf220a3d5a8601c6729a5ab",
+ "lib/setuptools/_distutils/command/install_lib.pyc": "78ae93358bfa272914a1c5a48c092c1262b00a2b78145efbc34ae4657b5193c9",
+ "lib/setuptools/_distutils/command/install_scripts.pyc": "d8e761f7264049bd4ec5aeb67fef51415de3b45552bc40c3d0f7715119a7886a",
+ "lib/setuptools/_distutils/command/sdist.pyc": "56c881265de61c0605f9a18c2c06f63c1ebe9d6eea69e9289a55fd1dd2b1854b",
+ "lib/setuptools/_distutils/compat/__init__.pyc": "918a4ff525ef6df594d098c1f583235c98653860152db517614ee5632648aebe",
+ "lib/setuptools/_distutils/compat/numpy.pyc": "dac5da5c94e257faa3b89ad9e642592b857dd060061e5227d307812e124bf483",
+ "lib/setuptools/_distutils/compat/py39.pyc": "e2ae21acd523b15546fcf13836e654492acdcb5b0fe4596e98e662e2ad8db5e0",
+ "lib/setuptools/_distutils/compilers/C/base.pyc": "0438999c505adff869a4256a369cd39bd313e7855976e240884e095f0661936a",
+ "lib/setuptools/_distutils/compilers/C/cygwin.pyc": "62ef211159001b12901b36b2d52cec7511f6d787f174645549d45c3875a1650e",
+ "lib/setuptools/_distutils/compilers/C/errors.pyc": "ce33835d48fae25e423baea22e3e2a001179a802d029a08bbc0d56e1c20c0a43",
+ "lib/setuptools/_distutils/compilers/C/msvc.pyc": "71c204c6aa9a48932cafc14e53923373d1d18f20be90e81817b6de37498e955e",
+ "lib/setuptools/_distutils/compilers/C/unix.pyc": "6d56f19f72161e6ea1983b29bc5894e85294dee808dc366d739496a0deb43695",
+ "lib/setuptools/_distutils/compilers/C/zos.pyc": "72ad03dba0a690637c324df7db6803f7b6ac98327f2e7e681c4a64c1fc683141",
+ "lib/setuptools/_distutils/core.pyc": "17b3e8e46af16b6687c5597c728a55f30af73cfa9e05902672e4df960b5d7a46",
+ "lib/setuptools/_distutils/cygwinccompiler.pyc": "318a17c0c9397256a589f50e8e60e376cae0394650612c21537103758977b1d6",
+ "lib/setuptools/_distutils/debug.pyc": "e55b43b5be9a165315eb59054729691127dfe624b19610d32529b59a4c368f15",
+ "lib/setuptools/_distutils/dep_util.pyc": "b418d730e346f2210d314bab075a7cbe6412047da98fd17aad222c1fd605bf36",
+ "lib/setuptools/_distutils/dir_util.pyc": "faa111ff17cd44a67267960db9ad09c0986d330d6d440bce033cc0d5545f1357",
+ "lib/setuptools/_distutils/dist.pyc": "415de9e2264201784b1493b13d441e62d35ff4aede0ecaf69b9611da40589c9f",
+ "lib/setuptools/_distutils/errors.pyc": "a5553b4b1f6d42f1382967400450a3c259c6b6f3e9b5cd12c15b0c3d76f8b025",
+ "lib/setuptools/_distutils/extension.pyc": "5a1835f5888a21e862bfd46088a57d85e26d700498db006699760d11211bbfe8",
+ "lib/setuptools/_distutils/fancy_getopt.pyc": "2255b09b011ddcab6d6539c26ecc081eac8c84d0de4704b06d4def70b78db2ea",
+ "lib/setuptools/_distutils/file_util.pyc": "1c0d53a8c4686b80e2bdcfa6e1cf6bdc8e8d8ad5a095dc50cac73f8970d768a0",
+ "lib/setuptools/_distutils/filelist.pyc": "db66985cbfce8868ee1183c56829dd17a368cbeea2d7dea68997c1c198203982",
+ "lib/setuptools/_distutils/log.pyc": "967d9984aa6a25aceb5e27a89dca2f50dd895ed9d96effb8c0612624ff0a318b",
+ "lib/setuptools/_distutils/spawn.pyc": "5cedcac358fe16926cbbf081f70036724d085d891e5b2d5a48d59bf6a0b486ae",
+ "lib/setuptools/_distutils/sysconfig.pyc": "c7cfcaec9be6f299df45f12a6fde7313cfba82398346c66da021e746a1dc3036",
+ "lib/setuptools/_distutils/text_file.pyc": "f4e42f724d5b66d193e7c07529fba4af4d4cbd2c2410b02c744a48cfacde5f87",
+ "lib/setuptools/_distutils/unixccompiler.pyc": "753bb3b9d9040535303d05be4080e563b1a55666f748edee4f73e73f42aa0303",
+ "lib/setuptools/_distutils/util.pyc": "74900571b2bd89b509825887ea7849722d5dca22d74528695dc67131794a97c4",
+ "lib/setuptools/_distutils/version.pyc": "ed920c7dcc767bee93769022c1f246afec19452336a520ed4a6151b0cf05c52a",
+ "lib/setuptools/_distutils/versionpredicate.pyc": "ff2380d11a2b2177468326b68978e8fc3f487b35dc32078b8cf4668b9995f6cd",
+ "lib/setuptools/_distutils/zosccompiler.pyc": "ddc9ef4261ca4fc9dda17e7985ffb38fdd450bc4491f72d339b42c189e81e93c",
+ "lib/setuptools/_imp.pyc": "e2ab24836941947ad05e65b2b119be4932da8e27a4d5cfdbac875dc0ddffe02e",
+ "lib/setuptools/_importlib.pyc": "f713396fd3bd77c7f1ddd64e0bb72991cb318dd0de39de09bea5ea31874049b0",
+ "lib/setuptools/_normalization.pyc": "5ee14886d6b8fb60a6383e3c744d1787bf013a1a97fae37d0d911ea48d8d2e84",
+ "lib/setuptools/_path.pyc": "69f9fe50b629fe4b1cc559d7184f220835e7837fbcefa49e67a83f6b455cb859",
+ "lib/setuptools/_reqs.pyc": "338523f37de53a59c530dd870e714023d62c5a61a89aeccf019e65ffabfd7fed",
+ "lib/setuptools/_static.pyc": "689c18d5a89ea7319f600627ca9b42f8e8d24818e70cf7ea9b302437bcb2c3c5",
+ "lib/setuptools/_vendor/autocommand/__init__.pyc": "1c6d6a938b23fa22287fa927975884bc829f868801d01912b3b32d4b9eb6bb42",
+ "lib/setuptools/_vendor/autocommand/autoasync.pyc": "d0e2d1c92cf108f583c714186ee1fd13bc28176bcdf86c1d1c31ee158abb37aa",
+ "lib/setuptools/_vendor/autocommand/autocommand.pyc": "8d78983394a79042c5e85e1951cc9fc275ae9dc023c48eefba4a86a3d1aa24f6",
+ "lib/setuptools/_vendor/autocommand/automain.pyc": "6ccca5427d8efb100923ed66ed888899e2224e964c3a049bec6539ba78d174f0",
+ "lib/setuptools/_vendor/autocommand/autoparse.pyc": "330a5257bb427bdb031c928dc3ce9ef5aeaf507f5c029f923b484807982f4cba",
+ "lib/setuptools/_vendor/autocommand/errors.pyc": "af6ea000c063683861bf5d72248c5e662cf3f0f9e16bb353bf64a5c89a0b0282",
+ "lib/setuptools/_vendor/autocommand-2.2.2.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/autocommand-2.2.2.dist-info/LICENSE": "ade78d04982d69972d444a8e14a94f87a2334dd3855cc80348ea8e240aa0df2d",
+ "lib/setuptools/_vendor/autocommand-2.2.2.dist-info/METADATA": "3800d9b91dceea2065a6ed6279383362e97ac38b8e56b9343f404ee531860099",
+ "lib/setuptools/_vendor/autocommand-2.2.2.dist-info/RECORD": "822bba66b41526fa547186b80221f85da50d652bee5493dbfe5d14085112f0c3",
+ "lib/setuptools/_vendor/autocommand-2.2.2.dist-info/WHEEL": "db07a93359e4e034b8785a58ad6d534ea3dca0635f1e184efe2e66e1c3a299ba",
+ "lib/setuptools/_vendor/autocommand-2.2.2.dist-info/top_level.txt": "0337e180a292f04740c16513485f2681e5506d7398f64a241c1ea44aac30aaed",
+ "lib/setuptools/_vendor/backports/__init__.pyc": "085128234369c2bb3f8239c4b02c02d6bece52391405172f0175ec1ddbc656fc",
+ "lib/setuptools/_vendor/backports/tarfile/__init__.pyc": "a6ce0e13ddda95e0f973d4cc78009d9fc46f37529d77c87da83f85c07fa6b0c2",
+ "lib/setuptools/_vendor/backports/tarfile/__main__.pyc": "c9e9413bc9ca5462e2c39db3937a0cd53aa0be29e3e123a0555d5a7c697af45f",
+ "lib/setuptools/_vendor/backports/tarfile/compat/__init__.pyc": "f338bc3f66e64a84928cbc54a5085b822318c49d191f03ffcd7132d4ff2cbc5d",
+ "lib/setuptools/_vendor/backports/tarfile/compat/py38.pyc": "44aef7221c4eadcfd49a2b10c3e8f9a063d83dba28cdf586ecf2c7fd9bae50d3",
+ "lib/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/LICENSE": "86da0f01aeae46348a3c3d465195dc1ceccde79f79e87769a64b8da04b2a4741",
+ "lib/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/METADATA": "8215c54ead77d9dc5a108a25c6bdc72b5999aa6f62c9499a440359412afa5a51",
+ "lib/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/RECORD": "258a1f1c849e1175069a55a5d6ce357afdd04e34cd5de27093e4acec7a9d2ce1",
+ "lib/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/REQUESTED": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "lib/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/WHEEL": "189eedfe4581172c1b6a02b97a8f48a14c0b5baa3239e4ca990fbd8871553714",
+ "lib/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/top_level.txt": "7068da2cc3a8051d452b4029a23b73595995893b49ec91882bf1f05e212cbed5",
+ "lib/setuptools/_vendor/importlib_metadata/__init__.pyc": "834c963950e11d31f4f0cde0ee5a56269a5143c81e51689673a8cce79c7eb11c",
+ "lib/setuptools/_vendor/importlib_metadata/_adapters.pyc": "111a1f2ae156b00c6fbe0e3cf30c0cbf39ac4aa45285de26cb6730e6c4f8d9cc",
+ "lib/setuptools/_vendor/importlib_metadata/_collections.pyc": "9436c76bf6693b7f0b9037021b95a2b43f84b097f6a4f368514e7e920c068d02",
+ "lib/setuptools/_vendor/importlib_metadata/_compat.pyc": "edd20770f0c1ed3def1b6874e26aa1ed19300c3190ff7d9000168e81dcba3f67",
+ "lib/setuptools/_vendor/importlib_metadata/_functools.pyc": "089118cbb7a3b339f221a12ee1923173e4a2634c455abdab28184248c0d946e1",
+ "lib/setuptools/_vendor/importlib_metadata/_itertools.pyc": "f315772be3a93a50c979dc3d116618134484baf41c3d7f4c18773425fd9c5b2b",
+ "lib/setuptools/_vendor/importlib_metadata/_meta.pyc": "b158e3785a3a3ddaabb656ab5a4219ff0c4ed899c88950624456f17e6941ac4f",
+ "lib/setuptools/_vendor/importlib_metadata/_text.pyc": "ae8cbd0420ea34f8abee2dce00709776df5d27d418d60dff37efb2a522b57526",
+ "lib/setuptools/_vendor/importlib_metadata/compat/__init__.pyc": "14ed77dddd24974603d0dcc3cf336adb000d7e80bcbbdf6f63cabbecc2cd89be",
+ "lib/setuptools/_vendor/importlib_metadata/compat/py311.pyc": "0066b947bccf1de3fe6070e4288b4439b4b671e3f80a80096a444994ddc2ef06",
+ "lib/setuptools/_vendor/importlib_metadata/compat/py39.pyc": "110903562a93ab26290ac40decdd6f6ad07f1ad7c939805b1c6a9383f8cb111d",
+ "lib/setuptools/_vendor/importlib_metadata/diagnose.pyc": "a4b69f716008d54e8c1b94b1627a4cfa8473716835822cdd038401f8a1af8850",
+ "lib/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
+ "lib/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA": "6a7b90effee1e09d5b484cdf7232016a43e2d9cc9543bcbb8e494b1ec05e1f59",
+ "lib/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD": "0d8d3c6eeb9ebbe86cac7d60861552433c329da9ea51248b61d02be2e5e64030",
+ "lib/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "lib/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL": "9a0b8c95618c5fe5479cca4a3a38d089d228d6cb1194216ee1ae26069cf5b363",
+ "lib/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt": "08eddf0fdcb29403625e4acca38a872d5fe6a972f6b02e4914a82dd725804fe0",
+ "lib/setuptools/_vendor/inflect/__init__.pyc": "b719ca22fc8620f81f83bc6b53a6722eee287a4d0236a5312a8aba18c65fe69c",
+ "lib/setuptools/_vendor/inflect/compat/__init__.pyc": "82639416e0784e7c14b54584863a156f39183003807c128ecb66148984223d33",
+ "lib/setuptools/_vendor/inflect/compat/py38.pyc": "fabcb6a9aeb7fdc6252cb0200ec37a066d8e850b42ccd375ecb202e1e45e8f3a",
+ "lib/setuptools/_vendor/inflect-7.3.1.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/inflect-7.3.1.dist-info/LICENSE": "86da0f01aeae46348a3c3d465195dc1ceccde79f79e87769a64b8da04b2a4741",
+ "lib/setuptools/_vendor/inflect-7.3.1.dist-info/METADATA": "66030d634580651b3e53cc19895d9231f8d22aa06b327817c8332cfc20303308",
+ "lib/setuptools/_vendor/inflect-7.3.1.dist-info/RECORD": "5d7834ac1ba2612c6801050fde57a7b98b0f36acf88c3c2d4f376fd8911b3091",
+ "lib/setuptools/_vendor/inflect-7.3.1.dist-info/WHEEL": "cb8997f92397e1f6089289ec0060393743b2fbcfe0238157c391cd235c6abd68",
+ "lib/setuptools/_vendor/inflect-7.3.1.dist-info/top_level.txt": "9b9dae8dda75d02a93ea38755d0c594fa9049ed727bfeed397b52218d4f35990",
+ "lib/setuptools/_vendor/jaraco/text/Lorem ipsum.txt": "37fedcffbf73c4eb9f058f47677cb33203a436ff9390e4d38a8e01c9dad28e0b",
+ "lib/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/LICENSE": "86da0f01aeae46348a3c3d465195dc1ceccde79f79e87769a64b8da04b2a4741",
+ "lib/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/METADATA": "20c51a96236c0395f53b1f4c5d458e6a0721e51e16c1bff733b7aba76f5d06d8",
+ "lib/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/RECORD": "1e9b62bd70e4a5fa26e9594cbb80860ffeca3debfee8773daefa774cd259ca06",
+ "lib/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/REQUESTED": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "lib/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/WHEEL": "31d8bd3c3370119a6d3a34e551c02d87b5c90c5b4aac761a40c3ee9597810a24",
+ "lib/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/top_level.txt": "d099cddcb7d71f82c845f5cbf9014e18227341664edc42f1e11d5dfe5a2ea103",
+ "lib/setuptools/_vendor/jaraco.context-5.3.0.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/jaraco.context-5.3.0.dist-info/LICENSE": "86da0f01aeae46348a3c3d465195dc1ceccde79f79e87769a64b8da04b2a4741",
+ "lib/setuptools/_vendor/jaraco.context-5.3.0.dist-info/METADATA": "c43b60b897a3d2d37d8845c252fc44261d9aef171e21154111a9012d2afffed6",
+ "lib/setuptools/_vendor/jaraco.context-5.3.0.dist-info/RECORD": "55197b88a78443297bb2d827a75baae740b33896251d872835d4b4c75ec2f57e",
+ "lib/setuptools/_vendor/jaraco.context-5.3.0.dist-info/WHEEL": "189eedfe4581172c1b6a02b97a8f48a14c0b5baa3239e4ca990fbd8871553714",
+ "lib/setuptools/_vendor/jaraco.context-5.3.0.dist-info/top_level.txt": "d099cddcb7d71f82c845f5cbf9014e18227341664edc42f1e11d5dfe5a2ea103",
+ "lib/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/LICENSE": "86da0f01aeae46348a3c3d465195dc1ceccde79f79e87769a64b8da04b2a4741",
+ "lib/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/METADATA": "8b86946900d7fa38dd1102b9c1ebe17a0cb1f09c8b7e29f61f2bda4a4dc51eca",
+ "lib/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/RECORD": "632aa7c04f7c4bcc01c027af5b9bc76fe8958f4a181035b957a3bd3014ba248b",
+ "lib/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/WHEEL": "189eedfe4581172c1b6a02b97a8f48a14c0b5baa3239e4ca990fbd8871553714",
+ "lib/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/top_level.txt": "d099cddcb7d71f82c845f5cbf9014e18227341664edc42f1e11d5dfe5a2ea103",
+ "lib/setuptools/_vendor/jaraco.text-3.12.1.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/jaraco.text-3.12.1.dist-info/LICENSE": "86da0f01aeae46348a3c3d465195dc1ceccde79f79e87769a64b8da04b2a4741",
+ "lib/setuptools/_vendor/jaraco.text-3.12.1.dist-info/METADATA": "03359d9ba56231f0ce3e840c7cb5a7db380141218949ccaa78ddbd4dcb965d52",
+ "lib/setuptools/_vendor/jaraco.text-3.12.1.dist-info/RECORD": "816d945741dca246099388ca3eed74fc0667acbaa36f70b559b2494c3979b1f6",
+ "lib/setuptools/_vendor/jaraco.text-3.12.1.dist-info/REQUESTED": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "lib/setuptools/_vendor/jaraco.text-3.12.1.dist-info/WHEEL": "189eedfe4581172c1b6a02b97a8f48a14c0b5baa3239e4ca990fbd8871553714",
+ "lib/setuptools/_vendor/jaraco.text-3.12.1.dist-info/top_level.txt": "d099cddcb7d71f82c845f5cbf9014e18227341664edc42f1e11d5dfe5a2ea103",
+ "lib/setuptools/_vendor/more_itertools/__init__.pyc": "65058cd7373852a42523deeda9809d69df5877cf81babab61b324cf6635a07e6",
+ "lib/setuptools/_vendor/more_itertools/more.pyc": "fa0b3fb01b97a6b0570ad96d230f6fc6dcdaace03829d206e4814527514d9781",
+ "lib/setuptools/_vendor/more_itertools/recipes.pyc": "7e6f88cd5eae58c559870a0a12410448baf7d6e28d8dda31e4ae20fee6fa2b68",
+ "lib/setuptools/_vendor/more_itertools-10.3.0.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/more_itertools-10.3.0.dist-info/LICENSE": "09f1c8c9e941af3e584d59641ea9b87d83c0cb0fd007eb5ef391a7e2643c1a46",
+ "lib/setuptools/_vendor/more_itertools-10.3.0.dist-info/METADATA": "0453bdd0ef9f2cd89540ca63ee8212e73b73809514419dd3037d8fe471f737e0",
+ "lib/setuptools/_vendor/more_itertools-10.3.0.dist-info/RECORD": "77c8e73e018dc0fd7e9ed6c80b05a4404545f641fb085220ce42b368b59aa3d3",
+ "lib/setuptools/_vendor/more_itertools-10.3.0.dist-info/REQUESTED": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "lib/setuptools/_vendor/more_itertools-10.3.0.dist-info/WHEEL": "ad282afc9a4717d7c7475971e77ab083fd7ed8bca9644fea99cb976d552af78f",
+ "lib/setuptools/_vendor/packaging/__init__.pyc": "9ae6f1c09b44368762ef76c093baa7559176c68e624d4c9a881edd475794bbff",
+ "lib/setuptools/_vendor/packaging/_elffile.pyc": "3885f21e9eee991207169c5a1a6baffbe2c39523a3b823e2ad80eb21add424b2",
+ "lib/setuptools/_vendor/packaging/_manylinux.pyc": "4051d1234d15c8f49330aa850d0b7bbb102c9537e90265403cd3a4356d6c3967",
+ "lib/setuptools/_vendor/packaging/_musllinux.pyc": "c5f2af63c0819cd3054e58dac1abcdd15548aff4665fefd1067401ba366dd5f4",
+ "lib/setuptools/_vendor/packaging/_parser.pyc": "47e7759ebca0a29c2e0bc7ba7273375cff17382b93d58eaaddd5d3a3266abfcc",
+ "lib/setuptools/_vendor/packaging/_structures.pyc": "a5b67eab498b6b0300257eb0b3f1b98c7b28d2d76b8a94638df3243e1daedc43",
+ "lib/setuptools/_vendor/packaging/_tokenizer.pyc": "f513b146566012e924a9add4f4331a0dee1f59f413536a2c6c302f9d05be7e29",
+ "lib/setuptools/_vendor/packaging/licenses/__init__.pyc": "98b8393b8b27f265d1518a70db00e87943da882ab105fd012d6e8665c753c9d2",
+ "lib/setuptools/_vendor/packaging/licenses/_spdx.pyc": "1d44480711bab74897516c7ca943ce474826158582999115adc47d36a887cf49",
+ "lib/setuptools/_vendor/packaging/markers.pyc": "10f94dc673424e06f99a68da3751f4c3783946236923e17cb48a422bb9714740",
+ "lib/setuptools/_vendor/packaging/metadata.pyc": "0c417fbfe2045f6e9feeb8cceb5a8fdaa0430ce7487bac86d99570aaaec4dfc4",
+ "lib/setuptools/_vendor/packaging/requirements.pyc": "ff923482a14a4cd395ff71f1c51642cefffa941a7f301376663f9377ce878656",
+ "lib/setuptools/_vendor/packaging/specifiers.pyc": "9163141979beb891133567deb72874c04feee0ea176baa07c18369206cecae4c",
+ "lib/setuptools/_vendor/packaging/tags.pyc": "fdcf20fc9020a70effaed5a5d7aca84987379efb01a8567660a2eda49262ce0b",
+ "lib/setuptools/_vendor/packaging/utils.pyc": "27977159578170527ffd3c7ffe20dd7b38568d7de669904410848ba01e14056c",
+ "lib/setuptools/_vendor/packaging/version.pyc": "dda316931bbd4cafa3bc1fb5c21fb1519ba60db618646caac8f4674f2a689b36",
+ "lib/setuptools/_vendor/packaging-24.2.dist-info/INSTALLER": "e6184ce10e266134fdcfa401e8f1a95005bcd4f18d16b62b757323e2833fe9a9",
+ "lib/setuptools/_vendor/packaging-24.2.dist-info/LICENSE": "cad1ef5bd340d73e074ba614d26f7deaca5c7940c3d8c34852e65c4909686c48",
+ "lib/setuptools/_vendor/packaging-24.2.dist-info/LICENSE.APACHE": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594",
+ "lib/setuptools/_vendor/packaging-24.2.dist-info/LICENSE.BSD": "b70e7e9b742f1cc6f948b34c16aa39ffece94196364bc88ff0d2180f0028fac5",
+ "lib/setuptools/_vendor/packaging-24.2.dist-info/METADATA": "a211fceacea4e6621f4316364d2d0b7127c00de3856b8062082f9bc5957ea4db",
+ "lib/setuptools/_vendor/packaging-24.2.dist-info/RECORD": "6380eb5ccd0a63402b7f385b0046b52d814fc16dd612011e2f8882a977be03e3",
+ "lib/setuptools/_vendor/packaging-24.2.dist-info/REQUESTED": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "lib/setuptools/_vendor/packaging-24.2.dist-info/WHEEL": "0a950253178741b44de54191407611268acee407fe432fdf1cc72d710f034862",
+ "lib/setuptools/_vendor/platformdirs/__init__.pyc": "65ff81dd8c80f3cf3011ba3e6b77b329d71f94ae9cd15c4567b690e0edd4a0a4",
+ "lib/setuptools/_vendor/platformdirs/__main__.pyc": "edfcbc8c3332d9a3394beb33e8a23337ab5e4ec17e6dbfb86a391f76dce396af",
+ "lib/setuptools/_vendor/platformdirs/android.pyc": "fa0679c386e91566f48917ba878e75d163664b26c25b3a0289e2b9d9e26502df",
+ "lib/setuptools/_vendor/platformdirs/api.pyc": "c1e0e07068d32aa50b04ce5f25632d683b34198e03acc81a5bfeb08de951e5ca",
+ "lib/setuptools/_vendor/platformdirs/macos.pyc": "3d1590df12d9f2206c5e1d840325f068a8d0aa073ed2cca6f31277c0bd317396",
+ "lib/setuptools/_vendor/platformdirs/unix.pyc": "eec82c97c689dbb3d4532d0d775d51de3bdfb1e6ba5b36e6f1a7d3e37e0ed3eb",
+ "lib/setuptools/_vendor/platformdirs/version.pyc": "03043acda00803c67f4dcc31ae1d497b6be3386f2f3cf421020f0b51059fec74",
+ "lib/setuptools/_vendor/platformdirs/windows.pyc": "64527f610490c983d90c308a7d2d02ed71a87f0ccd05f8abd852dcec850e85a9",
+ "lib/setuptools/_vendor/platformdirs-4.2.2.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/platformdirs-4.2.2.dist-info/METADATA": "ce6b227b4d46d4cb57474c2022fe57a557933bb89daf4596bdf9b12ac296b869",
+ "lib/setuptools/_vendor/platformdirs-4.2.2.dist-info/RECORD": "4c211d76d42ed40efc3acfcc866d8912a718afbca2b7e51849442366d6e99fe8",
+ "lib/setuptools/_vendor/platformdirs-4.2.2.dist-info/REQUESTED": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "lib/setuptools/_vendor/platformdirs-4.2.2.dist-info/WHEEL": "cc431c46bf4aaf4df1d68cc6c20e6ff4d4012a7de49dda7a2d2a1295583e8e15",
+ "lib/setuptools/_vendor/platformdirs-4.2.2.dist-info/licenses/LICENSE": "29e0fd62e929850e86eb28c3fdccf0cefdf4fa94879011cffb3d0d4bed6d4db6",
+ "lib/setuptools/_vendor/tomli/__init__.pyc": "f96b0c56dde61b4c0b4fa25caa4e1f4e0a2db1d5d67550651e9f6eecd7f83b67",
+ "lib/setuptools/_vendor/tomli/_parser.pyc": "bdd5c6db222aebd6e7b4934e510d539df2d00df65433f5cdae90f0f381aa1889",
+ "lib/setuptools/_vendor/tomli/_re.pyc": "ca908493e34ef46e9688879c6dc448bd9fd065bd43de18c9d852ac83b51f3626",
+ "lib/setuptools/_vendor/tomli/_types.pyc": "46f588e62c31bcc8a36cc5e5a52cf31c83859d5f34e0016dd54ee1f5141f4d7b",
+ "lib/setuptools/_vendor/tomli-2.0.1.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/tomli-2.0.1.dist-info/LICENSE": "b80816b0d530b8accb4c2211783790984a6e3b61922c2b5ee92f3372ab2742fe",
+ "lib/setuptools/_vendor/tomli-2.0.1.dist-info/METADATA": "ccf0dc78a98fc0918b5ad67292b1e2c4bed65575a6246cd9d63c914f9942a0f2",
+ "lib/setuptools/_vendor/tomli-2.0.1.dist-info/RECORD": "0cb9f9a451a1e365ac54b4c88662e1da0cb54a72d16a5258fb0abff9d3e1c022",
+ "lib/setuptools/_vendor/tomli-2.0.1.dist-info/REQUESTED": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "lib/setuptools/_vendor/tomli-2.0.1.dist-info/WHEEL": "8cf311fc3ce47385f889c42d9b3f35967358fe402c7e883baf2eeaa11bd82d7c",
+ "lib/setuptools/_vendor/typeguard/__init__.pyc": "c912d3efca1e979b13f7ffa7162817c075d61305b2b81b7a92ef8d5105449bd2",
+ "lib/setuptools/_vendor/typeguard/_checkers.pyc": "f1ab52a82c59f73cec269b2d672105bb5fa4b4da064ef7ffe36009b155d9f88e",
+ "lib/setuptools/_vendor/typeguard/_config.pyc": "9a9ae2f5a31c9e25038f366b7df049a4d8cf5cff2c5fbab3b24a695136621e6c",
+ "lib/setuptools/_vendor/typeguard/_decorators.pyc": "f18d29582699503556ba836ddbe95492cde71f42bd945e2455aff88e4f88cf13",
+ "lib/setuptools/_vendor/typeguard/_exceptions.pyc": "679cbd8738ebff824f1f93e8eee4a45cd1016153cef9d9f834403400df0524b1",
+ "lib/setuptools/_vendor/typeguard/_functions.pyc": "f4bfe57f308d4a855f4c737ed6d8ff953f544fc60f2efec0ea53c5fc07da1e3c",
+ "lib/setuptools/_vendor/typeguard/_importhook.pyc": "ebdc8292dbf327da88e781f08cf9c3550c103570cf80ebcce4b81f2e4c493665",
+ "lib/setuptools/_vendor/typeguard/_memo.pyc": "65545f2891f79c8a52febcbe9098a6bcb0feb07c4b459c3effa15d678dd6db47",
+ "lib/setuptools/_vendor/typeguard/_pytest_plugin.pyc": "941edcbbd711086008723b56c195941c8117aad6c94b50ef5d74110e60ecaea9",
+ "lib/setuptools/_vendor/typeguard/_suppression.pyc": "e6e507e7cfc350d9f6b907975d0f7943bc332bb498e6659b05a8ea00a315e76b",
+ "lib/setuptools/_vendor/typeguard/_transformer.pyc": "0f67999f8f29e39bc2edce3f5c83d8d0d520a9bc0a45ea626a461c51c9b1b2c4",
+ "lib/setuptools/_vendor/typeguard/_union_transformer.pyc": "2f4cd5204e9b42ce5a168ee891dc809489b49c4e5c08f5dbd8b1a3892e1dacfd",
+ "lib/setuptools/_vendor/typeguard/_utils.pyc": "efb378b884de6a04f947d349cabca47ec12b4b7774cd136cb523412e2596edfb",
+ "lib/setuptools/_vendor/typeguard-4.3.0.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/typeguard-4.3.0.dist-info/LICENSE": "6163f7987dfb38d6bc320ce2b70b2f02b862bc41126516d552ef1cd43247e758",
+ "lib/setuptools/_vendor/typeguard-4.3.0.dist-info/METADATA": "cf675c1c0a744f08580855390de87cc77d676b312582e8d4cfdb5bb8fd298d21",
+ "lib/setuptools/_vendor/typeguard-4.3.0.dist-info/RECORD": "48a51959582478352275428ceecd78ef77d79ac9dae796e39a2eaf2540282552",
+ "lib/setuptools/_vendor/typeguard-4.3.0.dist-info/WHEEL": "189eedfe4581172c1b6a02b97a8f48a14c0b5baa3239e4ca990fbd8871553714",
+ "lib/setuptools/_vendor/typeguard-4.3.0.dist-info/entry_points.txt": "aa9ecd43568bb624a0310aa8ea05a57c6a72d08217ce830999e4132e9cea1594",
+ "lib/setuptools/_vendor/typeguard-4.3.0.dist-info/top_level.txt": "e33dbc021b83a1dc114bf73527f97c1f9d6de50bb07d3b1eb24633971a7a82bb",
+ "lib/setuptools/_vendor/typing_extensions-4.12.2.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/typing_extensions-4.12.2.dist-info/LICENSE": "3b2f81fe21d181c499c59a256c8e1968455d6689d269aa85373bfb6af41da3bf",
+ "lib/setuptools/_vendor/typing_extensions-4.12.2.dist-info/METADATA": "05e51021af1c9d86eb8d6c7e37c4cece733d5065b91a6d8389c5690ed440f16d",
+ "lib/setuptools/_vendor/typing_extensions-4.12.2.dist-info/RECORD": "7710002d81971e632aa6a2fc33dc5d74aaf5d7caae22040a65d3e31503b05ee9",
+ "lib/setuptools/_vendor/typing_extensions-4.12.2.dist-info/WHEEL": "1196c6921ec87b83e865f450f08d19b8ff5592537f4ef719e83484e546abe33e",
+ "lib/setuptools/_vendor/typing_extensions.pyc": "da914b270569d34f1bae6d27ec4e2f52f4d03767f92117e784d31ace7ecde8e2",
+ "lib/setuptools/_vendor/wheel/__init__.pyc": "d5c10bb617a24a86afb1c56a2e0d9107ab3cb397cedb9d3138a055838c15459f",
+ "lib/setuptools/_vendor/wheel/__main__.pyc": "abbf5b5996f1aa202c61163304ab94df1f69db694c736030a8169932c35ee06e",
+ "lib/setuptools/_vendor/wheel/_bdist_wheel.pyc": "edfbde80971d0fd4d96e4dcac67a757e5b31bc3ac3920087504fe822e75a1a5c",
+ "lib/setuptools/_vendor/wheel/_setuptools_logging.pyc": "ce6ed48f25f3f5c4651574093fdb37b94fcd88f808b0300ab4bd9dd759c734e5",
+ "lib/setuptools/_vendor/wheel/bdist_wheel.pyc": "3bfc54ab80ddc1299d8ea6a25d390adcdb198618a14c89bfc071f8e9bac96bb4",
+ "lib/setuptools/_vendor/wheel/cli/__init__.pyc": "c80f421d6b5af5b9e094d0086db167294818ade74c47135e23a13593815e851f",
+ "lib/setuptools/_vendor/wheel/cli/convert.pyc": "fe81be5feeacd3d287741796503097a99e976ded49c413e1be13797f45aed3fd",
+ "lib/setuptools/_vendor/wheel/cli/pack.pyc": "9713017518881a6a83abdc7d22e30e302464d3be3e215b891e96ca7fe8ede639",
+ "lib/setuptools/_vendor/wheel/cli/tags.pyc": "d6993d6591fa80e6f090a24c003191f6cb3525d313a82089ee5e04b7b7a4c422",
+ "lib/setuptools/_vendor/wheel/cli/unpack.pyc": "6fbe749e710f9408d14e7ead0299aa078ff3bd0e9a996ea4606818722e5a12e0",
+ "lib/setuptools/_vendor/wheel/macosx_libfile.pyc": "615fe94e4801b02e811bc90c5bf20a2c5c402eed6d24625bb945ac254aa40326",
+ "lib/setuptools/_vendor/wheel/metadata.pyc": "1e305bcafff7e20f40b5f5f42f62aa7249ffc810908bf85dc8717c77008e8b85",
+ "lib/setuptools/_vendor/wheel/util.pyc": "e3793859a800b732ac60f4158e913cdee8f1de9d97f458b670da2300a276f102",
+ "lib/setuptools/_vendor/wheel/vendored/__init__.pyc": "3a7e03c84717209bea060e233bbf022676c7568ed6e02f623bd5d424bb840015",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/LICENSE": "cad1ef5bd340d73e074ba614d26f7deaca5c7940c3d8c34852e65c4909686c48",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/LICENSE.APACHE": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/LICENSE.BSD": "b70e7e9b742f1cc6f948b34c16aa39ffece94196364bc88ff0d2180f0028fac5",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/__init__.pyc": "b177dd2a3fb4dc4581d9929f2efda9aa7ac370e430a6ed5de0b3a2c9fd437ee8",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/_elffile.pyc": "b98cab395540172ad3cdfffa48da3b2ef18e439b40ddde4f4e0d2ff924ecd759",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/_manylinux.pyc": "58c1e57ff7f36872857d53a699f8decde3f3f4aae8125e01ea5826a333bd9dca",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/_musllinux.pyc": "2f7da77b3d7a2d40472fffd4bf2251926669d9de15fbc3becdac7ff35749d7fb",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/_parser.pyc": "55a536757c40e98d34bdc4431e2640b5c6223ff3cfb015e3c74a5d34d4aa8a20",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/_structures.pyc": "8a7ad858469a7b58fa6bdd8a78814cdaf1a1aceb6aba2af01ef3c323ccd2f200",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/_tokenizer.pyc": "3bd98f43573e80dc2bd70cf6576853b243ebe31afa179c9d36b48b6776b1e93f",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/markers.pyc": "d854880bb40388a58ac58f3de1ab1124b0dfbc020d94030dedd917327a44844f",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/requirements.pyc": "f22a9bd65a07b931e95a484ec4a50912544c89ffc0179840be1bcf39e7748345",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/specifiers.pyc": "e6014a95c1af1b45fd27be131887384bac99da4b8def122b95649c632ef2e044",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/tags.pyc": "92b8dddb2e7e3259e39e352d3463fff77ff5fa36e006bf21f56d2bd540341609",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/utils.pyc": "1f065e707e7b9a554dcba35ffedc70c0b41bb9f1ce6799c5829e76df85e14fc8",
+ "lib/setuptools/_vendor/wheel/vendored/packaging/version.pyc": "10da05712896d347c9abb41a267c6c730499a60956501378383c185a37c1bb0e",
+ "lib/setuptools/_vendor/wheel/vendored/vendor.txt": "67610d8c1d62e69adf7b3f0274cd5276bddce99c6fdab451a253292e60677001",
+ "lib/setuptools/_vendor/wheel/wheelfile.pyc": "36f5ea08c3d24a5c1f4efe3a1f30deebb9531e7d1a7fac602e0e0f1b8e61ad5b",
+ "lib/setuptools/_vendor/wheel-0.45.1.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/wheel-0.45.1.dist-info/LICENSE.txt": "30c23618679108f3e8ea1d2a658c7ca417bdfc891c98ef1a89fa4ff0c9828654",
+ "lib/setuptools/_vendor/wheel-0.45.1.dist-info/METADATA": "98acfce07ee6ee3b31272cde21c4d53918936f434f315dfd2af3886211a09a30",
+ "lib/setuptools/_vendor/wheel-0.45.1.dist-info/RECORD": "d639f1ac7c993c3715bd42f27c616189b6b86792fdfd1b17afd77170d6e16984",
+ "lib/setuptools/_vendor/wheel-0.45.1.dist-info/REQUESTED": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "lib/setuptools/_vendor/wheel-0.45.1.dist-info/WHEEL": "0a950253178741b44de54191407611268acee407fe432fdf1cc72d710f034862",
+ "lib/setuptools/_vendor/wheel-0.45.1.dist-info/entry_points.txt": "ad363505b90f1e1906326e10dc5d29233241cd6da4331a06d68ae27dfbc6740d",
+ "lib/setuptools/_vendor/zipp/__init__.pyc": "c6eaea617f04180f03b106c5790821a90b30fddc79aeac97e7c2245e378024cb",
+ "lib/setuptools/_vendor/zipp/compat/__init__.pyc": "2f01c14c3d42402c5995111e5ab356848df760193f4b57837f293054fa4a3189",
+ "lib/setuptools/_vendor/zipp/compat/py310.pyc": "f84854b11da759d1b6128087df9417781bcc581d879f8c79bb1db2cb85184f80",
+ "lib/setuptools/_vendor/zipp/glob.pyc": "ca52a43179a3b3ba7efea98011087c2849700f5aa98ab30015a137bf7910043e",
+ "lib/setuptools/_vendor/zipp-3.19.2.dist-info/INSTALLER": "ceebae7b8927a3227e5303cf5e0f1f7b34bb542ad7250ac03fbcde36ec2f1508",
+ "lib/setuptools/_vendor/zipp-3.19.2.dist-info/LICENSE": "86da0f01aeae46348a3c3d465195dc1ceccde79f79e87769a64b8da04b2a4741",
+ "lib/setuptools/_vendor/zipp-3.19.2.dist-info/METADATA": "508ae4fe43081c64b0b0a2828588b3a8cc3430c6693d1676662569400b0dfdb1",
+ "lib/setuptools/_vendor/zipp-3.19.2.dist-info/RECORD": "f316f2e03fd9ade7ebbc0b154706848e2bb8fd568b90935109f0d8e3ce2b9bfe",
+ "lib/setuptools/_vendor/zipp-3.19.2.dist-info/REQUESTED": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "lib/setuptools/_vendor/zipp-3.19.2.dist-info/WHEEL": "189eedfe4581172c1b6a02b97a8f48a14c0b5baa3239e4ca990fbd8871553714",
+ "lib/setuptools/_vendor/zipp-3.19.2.dist-info/top_level.txt": "8806dda121df686a817d56f65ee47d26a4901c2a0eb0eb46eb2f42fcb4a9a85c",
+ "lib/setuptools/archive_util.pyc": "3884531da5beee64eb72632d05737bbb78680c148bd3513b6862c0a816621490",
+ "lib/setuptools/cli-32.exe": "32acc1bc543116cbe2cff10cb867772df2f254ff2634c870aef0b46c4b696fdb",
+ "lib/setuptools/cli-64.exe": "bbb3de5707629e6a60a0c238cd477b28f07f0066982fda953fa6fcec39073a4a",
+ "lib/setuptools/cli-arm64.exe": "b9a7d08da880dfac8bcf548eba4b06fb59b6f09b17d33148a0f6618328926c61",
+ "lib/setuptools/cli.exe": "32acc1bc543116cbe2cff10cb867772df2f254ff2634c870aef0b46c4b696fdb",
+ "lib/setuptools/command/__init__.pyc": "8004debd579263a4d9ed19e351867aacd73ec03fbc336c5f87fa49d731a2c037",
+ "lib/setuptools/command/_requirestxt.pyc": "95cf95b617bf2e8bc1257c463df997699f8131d160eccd6cf1c5ab0a8d175e7e",
+ "lib/setuptools/command/bdist_egg.pyc": "9b412b38b91d96a42aef4844c32f34c05eb0aa37faebb88978887c610d09c6d2",
+ "lib/setuptools/command/bdist_wheel.pyc": "e0efb42143a20402c36a6a0aa012a6baf6d0baca49220d74b2ad9123125615a0",
+ "lib/setuptools/command/build.pyc": "0decf0237ce7c72ba2ed381558618d570bf077f6a328dbe20507d5e000eb8f51",
+ "lib/setuptools/command/build_ext.pyc": "25f7eb15e30a6c5e433a9cae02cbb650fd6b7b9937f0ddb3e517d47198d57668",
+ "lib/setuptools/command/build_py.pyc": "348c1c115d2a10e09a4bae6f63509f3c50f25e73460fce990e77efb4363d518a",
+ "lib/setuptools/command/egg_info.pyc": "500a79aa9d052721d70a65a32eda302c9529be18864fe18898e545a81e53ecde",
+ "lib/setuptools/command/launcher manifest.xml": "c652db8d6ac1d35b4a0b4fa195590e2a48923dbccc9a5d9e38fb49fee7029db1",
+ "lib/setuptools/command/sdist.pyc": "6303574a2a2e88c34c016080f09987bb7e49ad0c6dc2fbf0d32e58a6874c5e1a",
+ "lib/setuptools/command/setopt.pyc": "4d9ab6415e04c54dc7ecb13b991c3c961b1752dd7a107ab7c2c197f6be309008",
+ "lib/setuptools/compat/__init__.pyc": "4292941766ca7b70f78e6de1375dcb2de283cf9c9ed7e404837bb47fa24dc25d",
+ "lib/setuptools/compat/py310.pyc": "d7130aa8543ca4a97b21eff099be4b6e36c164a15ed49f6d9464e4e6e23c6d80",
+ "lib/setuptools/compat/py39.pyc": "1c38205936205c1b5ebdbff1c8a7be68d82f278bf24bf28d331cc0f31f5d4422",
+ "lib/setuptools/config/NOTICE": "2dddf08818297a3b89d43d95ff659d8da85741108c9136dfa3a4d856c0623bd8",
+ "lib/setuptools/config/__init__.pyc": "b5c0e56b296db3c9a198efaf4196e3e03e54d039044c4efb4f71797619c75d5b",
+ "lib/setuptools/config/_apply_pyprojecttoml.pyc": "08d0056fbe7ad65d6d9de889e7be3032d0e167f5acfaad10532199f3099b8ec2",
+ "lib/setuptools/config/_validate_pyproject/NOTICE": "5d300dbfa643138b013b75ac9caeee591f951b8b0ee24288c34ccd926c4780c8",
+ "lib/setuptools/config/_validate_pyproject/__init__.pyc": "7216c3eaa8af39dc71419356f72b14e8f619b23ab04c86e8cf562a572716bd68",
+ "lib/setuptools/config/_validate_pyproject/error_reporting.pyc": "1425d2264afbe3c1c3e7421488e55b58521de020ce3d7ff00bc265ae501369ff",
+ "lib/setuptools/config/_validate_pyproject/extra_validations.pyc": "2d087895475c1b3e449eebf9280e3e4781a36aab3ceef3b31a3938da19ea8b2d",
+ "lib/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.pyc": "c0514fae9f5c646ec9b693c6005d81f338f1c7a47e31a5250d831fad570d7c99",
+ "lib/setuptools/config/_validate_pyproject/fastjsonschema_validations.pyc": "12c96fce25621ace335b926aba212650167ea551336fc28e383966f00bc8c75e",
+ "lib/setuptools/config/_validate_pyproject/formats.pyc": "5e59e4b83f508d9bbd5ab9cf0b88a6fb0e1aa11f71b530c0f01b13861a677ef9",
+ "lib/setuptools/config/distutils.schema.json": "4dca77da44678703911b0ffda7a1848b4f258f6875e6d411cce6016f31a67015",
+ "lib/setuptools/config/expand.pyc": "ab441c29804cdc62e9433ac288b120a9f4f2c841e5716bd9dc54623306e7ea1f",
+ "lib/setuptools/config/pyprojecttoml.pyc": "9a3276df118813b3499988812ac71aba564307c775096bfeb5437ab84cbff0bb",
+ "lib/setuptools/config/setupcfg.pyc": "e3e7c72f6ff987ec35c0b2bf23aa6d111f07a9787a4440d04013c2a252fabc7e",
+ "lib/setuptools/config/setuptools.schema.json": "759051b921276646ada1596dd645701bca1c4de45d3bb043d31bce58a1f9e0f6",
+ "lib/setuptools/depends.pyc": "3a9952102810d92e94b4611238d5268c7c67557ef763c0b7c9acce3e3f453139",
+ "lib/setuptools/discovery.pyc": "031772304fbef6a65e614e5690e62c0dbc5a970b3c8e7e34897a52b3a30942a8",
+ "lib/setuptools/dist.pyc": "4e0e8da183db87b5ec35c4c78aa4b33a34304b78d37d59567f0294008e350574",
+ "lib/setuptools/errors.pyc": "3253aab85a484c7142514824688a907f9495be7ebafc233eaed59e59f46f5fd9",
+ "lib/setuptools/extension.pyc": "273b064991397a306b950edc7beadb49a5c4b2daa9418d1823849a700743d44f",
+ "lib/setuptools/glob.pyc": "7ed6ceafee2ad85c12a5c2f3f28c58ffbea00a8c80f29d5f1326785462fc46cd",
+ "lib/setuptools/gui-32.exe": "85dae1e95d77845f2cb59bcac3d4afe74bbe4c91a9bcc5bf4a71cd43104dbe7c",
+ "lib/setuptools/gui-64.exe": "3471b6140eadc6412277dbbefe3fef8c345a0f1a59776086b80a3618c3a83e3b",
+ "lib/setuptools/gui-arm64.exe": "e694f4743405c8b5926ff457db6fe7f1a12dec7c16a9c3864784d3f4e07ae097",
+ "lib/setuptools/gui.exe": "85dae1e95d77845f2cb59bcac3d4afe74bbe4c91a9bcc5bf4a71cd43104dbe7c",
+ "lib/setuptools/installer.pyc": "63736d66e0521626cd00b028a101c0f1008a50a750fba0a50de0d7f676665e91",
+ "lib/setuptools/logging.pyc": "2c9d4c28ca72ff7d4a7483243dff2652731402a34aa5a39f9c2e712734578c1c",
+ "lib/setuptools/monkey.pyc": "3f44e68e4a95d6177e5036f88ca4f3711e5a86c05f4c33ba830348753df98ef2",
+ "lib/setuptools/msvc.pyc": "6628eedf88b2ebd1d4508f8c1a075b2622876b8548ed7268db428dae8d9ea221",
+ "lib/setuptools/script (dev).tmpl": "454cd0cc2414697b7074bb581d661b21098e6844b906baaad45bd403fb6efb92",
+ "lib/setuptools/script.tmpl": "5864ede6989eccedbb73e0dbc7a9794384f715fdb4039cfbf3bda1bf76808586",
+ "lib/setuptools/unicode_utils.pyc": "90c131fccd873b24541132dc81dd94b76a86fe99ea2b47ca2d716c69e329a571",
+ "lib/setuptools/version.pyc": "63b4c6c0fd755f0a0c86483330d8f9dce9219855f9c62fd841bcee3e2e7ae448",
+ "lib/setuptools/warnings.pyc": "9f7a398ceb94e0e72f0738a4aaac55132117fed3088dfb49cab2e499e82104fc",
+ "lib/setuptools/wheel.pyc": "20214525c717523f33486a0fdcce9ec2aa68d11283a83c87d560b3f359aee300",
+ "lib/sqlite3/__init__.pyc": "bf01278746800699f96c9defc07f07df31e16f69c6bd176ffe87a38f4a249402",
+ "lib/sqlite3/dbapi2.pyc": "f2066c047a2e8826d5a70e060863b3a3b929c778dbf32a28aaaefa0ca54bbba4",
+ "lib/sqlite3/dump.pyc": "0f61344d515e091c2dffea07795d922b5d80639211746c86b885a21f6600218c",
+ "lib/sysconfig/__init__.pyc": "00c689875539112686f1685a9ecb915d5d1ab56a799ceade3ecb5d0fbc5dbc0c",
+ "lib/termios.cpython-313-x86_64-linux-gnu.so": "36806c3058952d7be5eedf3aa9d98ca36085a796eebf95465e7cf9353d25b45c",
+ "lib/tomli/__init__.pyc": "f43362530b3298bdec5fe517d664ce3525ce68c42c393809884b9ffc3dbd706c",
+ "lib/tomli/_parser.pyc": "bbefe87b746da008fa74347f1b4a6daabbc4328aeff390becde07e15cb1b971c",
+ "lib/tomli/_re.pyc": "4d61a6fa3ecd4615b4877b6352f51d1e378de7eb82b85705af9c644ee50aafd2",
+ "lib/tomli/_types.pyc": "b8b7c9f155a21203e1fba76c8e3e12f0c98cfeed8077d6d094189ca55c7637d5",
+ "lib/tomllib/__init__.pyc": "78a8934f811263c52117a773841d24a78bdcdfb2bf7817895381815fe87f3041",
+ "lib/tomllib/_parser.pyc": "fb095353e540498bc24ad45ed8abc441554190012ea371d8c875f42ef224f624",
+ "lib/tomllib/_re.pyc": "504db2bbb78bfcce6ddaa1b7d82b085dde9824c11d04a56d9dbb625e71ca44b4",
+ "lib/tomllib/_types.pyc": "467f79f09bded6d0c1cbf3a429b25c00ff5172a30041a1581c1674aa513b79c9",
+ "lib/tomllib/mypy.ini": "01d8afe88929a47bb6425f11573cccddc244af126057165722cd40f0eca3f35c",
+ "lib/typeguard/__init__.pyc": "004d515f6f1b8727c06c8ad6e1141d3003288674bfe60db1e3c84b7cb0ed5018",
+ "lib/typeguard/_checkers.pyc": "b56f54dafddb882eab55991c728dff813668728541b5411c461e8a7af9b7d451",
+ "lib/typeguard/_config.pyc": "9fd684d2bd3ad1c8afe32a2ade6c7a84144e9c7a668b42596faeb0b5c4198a07",
+ "lib/typeguard/_decorators.pyc": "f8346f854c460dcb58b843dd150e0e23c452eb110a77e340c35fd1289868edf1",
+ "lib/typeguard/_exceptions.pyc": "81b1024423c798de465cd8d72cef23d7be0009eb3aaef076e6b5819d2080ecf7",
+ "lib/typeguard/_functions.pyc": "2129b02f09cd2712b49e2c3fac9ba165d4f53fd309adabe4866ad17927ae79ba",
+ "lib/typeguard/_importhook.pyc": "f8063aac9853d29d2ad980d45ae61d24891c7f81dc374db51f9ffbde2b3bf0de",
+ "lib/typeguard/_memo.pyc": "8df2193c1c34c3d0103e23e4720506f6f2514ed424bdbdebaa6b29398da3df20",
+ "lib/typeguard/_suppression.pyc": "5a477628118b4008e0891f13858cbbb6692d3f42432fbb91efb5363371e7ec42",
+ "lib/typeguard/_transformer.pyc": "87bba79f76826ff010800afac4626869712a0f9a67037acb586c5339240b4535",
+ "lib/typeguard/_union_transformer.pyc": "ef384bd6995ac2c5683fa331d40cb4aad4decea868e096d26d835e2d990eb26f",
+ "lib/typeguard/_utils.pyc": "a223bcafb003a24053efc06abb371392e1b8d67065b9ac21976ffcfe50c3070f",
+ "lib/unicodedata.cpython-313-x86_64-linux-gnu.so": "1e6b4b7684ff58c4aa1b57fe09392cd1dd32292c5a213d9d7aedaf62d9ef186c",
+ "lib/unittest/__init__.pyc": "dd847182f924066fdd3e7dfb0a8a86d6e0f4d267cc68cfeafc99a1bbc1147f22",
+ "lib/unittest/_log.pyc": "2460b141248f2d601f5e74f115dd76bb2de606184d290736727f2baefe7f347e",
+ "lib/unittest/async_case.pyc": "1fcece8cba7287383cb2cac4cd90228702d63004dfbbaeaafe9bfbf2fbf02d32",
+ "lib/unittest/case.pyc": "641267e3a90b31654675691acdf3df24ae63740ac6d1ffbf996b16b06e85083b",
+ "lib/unittest/loader.pyc": "36340f5767b3ff59193d934e702e9dc2cee75fff68aff0c8286a11763efd1857",
+ "lib/unittest/main.pyc": "aa08860e452432ddaccbf8fd9b4a1dc0ad51b8be9312737a122110965f912c0c",
+ "lib/unittest/mock.pyc": "d4ca9946a23608950a1bf7a0b511d7b227468cebf532f710c7d1394e64353a9d",
+ "lib/unittest/result.pyc": "866a91396a45a93235d305a388c5345567d38fffaba394e40f1c5d849071dfad",
+ "lib/unittest/runner.pyc": "ebf543eb0246371879ef57421eef36043ed75da25567685ff53c065aa6293995",
+ "lib/unittest/signals.pyc": "71224dbaafcc4434429fc87b0be31b1e8aa108cec91ada2ed0d59ee8e66e71c0",
+ "lib/unittest/suite.pyc": "99285ed731c428be6e7fd83198623627441976fa9af5c819daf06ba85f09ed08",
+ "lib/unittest/util.pyc": "e0af8ee24640a521d1260dba0ce71daf1d7ee6ff978d074cd41453fac7b519e5",
+ "lib/urllib/__init__.pyc": "03b5141742e7f6a1994e9c7ababb1d4e6fd2cdb4c4b9fa64efe64b76d202d35c",
+ "lib/urllib/error.pyc": "c3cf49fd807844d61d28598b14d02af35cee60dc07ea5a588e99ce3b821da928",
+ "lib/urllib/parse.pyc": "4804d946338f096f789734c78e19b7235a4fc5649e5e1147988c3878a569c9b2",
+ "lib/urllib/request.pyc": "a084100b492561f64d9a9ba734e2b5938b470912c2504974ff3e772d07c7365b",
+ "lib/urllib/response.pyc": "6135f1906a1c507c1870deadfe248119a0aa4fd0805926f18542cd4357ea89ce",
+ "lib/urllib3/__init__.pyc": "572cfaa7ab9e9c70c666aef00687e49d4117a49d268de27e10604f076858ba71",
+ "lib/urllib3/_base_connection.pyc": "df3bf33a9a39bc608923a520691d9056770793813d5855bc5c461fd5a49ab26b",
+ "lib/urllib3/_collections.pyc": "f4933654c86016223e6e4b4fba1c5b728faabfa592264fe5b20eb5ce17bab235",
+ "lib/urllib3/_request_methods.pyc": "bb4f9b47f9244890e13e30a808e60fc2e976408ff505dcaa7c1c341902120a99",
+ "lib/urllib3/_version.pyc": "28080e33c5ac87e62382120de3604ea1bb0b4c8ed5d02d5824e31029f279cac6",
+ "lib/urllib3/connection.pyc": "f2338ecb66b213ebd81d6ab8b43b404cb4f02e905d593bb1edf3d5f7e732cb81",
+ "lib/urllib3/connectionpool.pyc": "735443369c6546d517a781d718622dc8d5274d031340e0648c4d0c60654e6357",
+ "lib/urllib3/contrib/__init__.pyc": "6e76bf3e0dac01f2f1c61876369341661fc1f73f1b0d6a1c3c0411f9b4a0561f",
+ "lib/urllib3/contrib/emscripten/__init__.pyc": "b95ef2446e0fd0ffd5fb2b760714a521bdb7e563ffe50345c8c60a07f29866a9",
+ "lib/urllib3/contrib/emscripten/connection.pyc": "2a42625d2b9d0fc0c617e93d0080389ab4cb83c4c675301392182c62fc4343e2",
+ "lib/urllib3/contrib/emscripten/emscripten_fetch_worker.js": "cf5937cd9e3f84329ddfeb4def0cf3f0b1e31c2da9c4dfeebbc07793d0fd0377",
+ "lib/urllib3/contrib/emscripten/fetch.pyc": "6b337a35544753a0c59743f52ab48faed5616df8200abf227cae74c1f8ddef9f",
+ "lib/urllib3/contrib/emscripten/request.pyc": "66468e885cf2ff1f0af759d94dc40cef08d97eb738d8b3ca14711328ffc30c4e",
+ "lib/urllib3/contrib/emscripten/response.pyc": "8b18bbe59b9b02a0faa6689d71615fd5bccfca956ac15cbee0bf5acffa971204",
+ "lib/urllib3/contrib/pyopenssl.pyc": "d262e3e11de44a5f811e8b1e8db3a70668fb4d62403484d0f24a8cd0f54ed6ce",
+ "lib/urllib3/contrib/socks.pyc": "0ab327753e193c58da3f643bbdd3df1f9e25011a1ce826c41aa04cd17aead3fc",
+ "lib/urllib3/exceptions.pyc": "05a8b440a0cbe2cb0c423af2c70aef8c48c2bccac18e31c236e9df5276733472",
+ "lib/urllib3/fields.pyc": "4408cac1cde9bcacd308f4a7808108b81403f6188707b4922ef2878353c74bad",
+ "lib/urllib3/filepost.pyc": "ac2cb9b4b32871ffcc690d71dbaf8fa96f6e2979240fd8ed251e49bd7845d7a7",
+ "lib/urllib3/http2/__init__.pyc": "c90c1fa6976c8b989135641cb1c634e44bc455ccc4ec860d10433f1be9282eab",
+ "lib/urllib3/http2/connection.pyc": "fec9318866c981bfca4668b9192bdb1b0cbd9d1baa56a653a0c84338a53eeac3",
+ "lib/urllib3/http2/probe.pyc": "392329d5f26e8b3f01173df90c04a9f8a511c10a2b96c9c6727c433112d1011a",
+ "lib/urllib3/poolmanager.pyc": "6b037794dda4df033ccf430c094add63fb32a67393b5b103a2809976c49ee549",
+ "lib/urllib3/response.pyc": "3e5d1f7918651fd722525f67db3cd306d6dd356564efa146e6501aa8a8fa47aa",
+ "lib/urllib3/util/__init__.pyc": "c221c200d2ef4ca8b2c10ae75f92f348f42863b3b2ed1ae718308d8468cf16f8",
+ "lib/urllib3/util/connection.pyc": "2c36bd4f71ff5a521b926e9294b709ec7e3df9f10af0e935fcc723c619a26f20",
+ "lib/urllib3/util/proxy.pyc": "2c0eb62eb67aa6109616245b0872fe90c7b473ef9f7f6e4006b74e422eb2b003",
+ "lib/urllib3/util/request.pyc": "64e851ff9ff0cf9119ca7e680f9c7d5cdaf3a956aa30b88d157f8b8b613694df",
+ "lib/urllib3/util/response.pyc": "8d3160a8e4a42688921111f35dc2724bb6fb2748c78424d02a56fa3505c91bb7",
+ "lib/urllib3/util/retry.pyc": "a6c977415c0bc2b9710e79fa77cd4048b4d52260bcfd33a8ad32e8a627d59ce3",
+ "lib/urllib3/util/ssl_.pyc": "ae5b282899cefe820242258a43955a5d22ca23b913f4c6e2e52ad92f5a53e9ee",
+ "lib/urllib3/util/ssl_match_hostname.pyc": "280508a085e1c9af633681a310e18b97e0fe9024303da6fb164091ec798712be",
+ "lib/urllib3/util/ssltransport.pyc": "5756423bb66738b15f2ebf01087a6b785e69b47568f8f8470675132c69c0743d",
+ "lib/urllib3/util/timeout.pyc": "6e50fef3a6d9ed4437de696ee4e2b79fa6e6117bef84479109ba633ee0050ea0",
+ "lib/urllib3/util/url.pyc": "65f5b00108d7a1f42ca7adcd39ff4eed6d4d1174598693065ffed3c345d3b1ea",
+ "lib/urllib3/util/util.pyc": "63d2f6954eb5a7bf7afcae03ade56a208dd733167f3d47b3b6b603ffa8a6a8d1",
+ "lib/urllib3/util/wait.pyc": "d2fe69cef2e8b19a8588a7dd43b771077633c408b036bda4a546c96bd8c9f26c",
+ "lib/wheel/__init__.pyc": "4d7d889b754f597e72889fc8be8162346a1f4a93d939dbc71a9951387c8b6b56",
+ "lib/wheel/cli/__init__.pyc": "7089b6b3f120d255ad195ff5fa8d06adec0637785c43f29b000e0c5b369d0a6d",
+ "lib/wheel/cli/convert.pyc": "0a7bd716d80dcd594752122886e51ec3db7ac9801ea95b237af7272aa268b1bd",
+ "lib/wheel/cli/pack.pyc": "fc70c490560c234b7f726d38e154e83abcb40ca7c2d092c69b529281c392ba7a",
+ "lib/wheel/cli/tags.pyc": "e08d420547dc7dd514c1fb817406bff8f63c05f6f829f70851afed1ef5a0f329",
+ "lib/wheel/cli/unpack.pyc": "8b0fff83c499d16e9f8205afa3ffd85542625873d2264df861ebb6733459647f",
+ "lib/wheel/macosx_libfile.pyc": "c7cf190dcb32dc8c41169e1cb2a582587329757f717e9d528fa33e5617bc9b31",
+ "lib/wheel/metadata.pyc": "49d1a41f3c733c950ba5b5498f055cfd8e571625e890e67eba557d268c6a655c",
+ "lib/wheel/util.pyc": "60ce6eb949706012e6ce1cecfa03844681a9e96051f1fdb88a43a25f6f7e19f7",
+ "lib/wheel/vendored/__init__.pyc": "e3da39e89340ad85a7ec4fbad9fc3e09e2cb31a7420eb3e871922272c4eee4c0",
+ "lib/wheel/vendored/packaging/LICENSE": "cad1ef5bd340d73e074ba614d26f7deaca5c7940c3d8c34852e65c4909686c48",
+ "lib/wheel/vendored/packaging/LICENSE.APACHE": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594",
+ "lib/wheel/vendored/packaging/LICENSE.BSD": "b70e7e9b742f1cc6f948b34c16aa39ffece94196364bc88ff0d2180f0028fac5",
+ "lib/wheel/vendored/packaging/__init__.pyc": "80479669a68e5256c1a4ddaeaf8f2203eb7e11cc3c4684fead625d7db51b7e7c",
+ "lib/wheel/vendored/packaging/_elffile.pyc": "e88c8b109ff2efad53652a941d02fe505be9c74a4decec213f38d66ff9b7abb3",
+ "lib/wheel/vendored/packaging/_manylinux.pyc": "180e52a68ce98f4b3f50c9ccedb33b0b4525a9e4c41f309555ba400102eec8a5",
+ "lib/wheel/vendored/packaging/_musllinux.pyc": "798de16920a5546bf2707e89410b8d0bfb4f6c612e43dcf2485669b43951bf38",
+ "lib/wheel/vendored/packaging/_parser.pyc": "f03bbeb5623efb9086fda423c952da099fb158474fc05e96b003718ae3a497b5",
+ "lib/wheel/vendored/packaging/_structures.pyc": "22b0a6aabba1058c02c78b05f7a84c32aa24994686eaf7d3994d5a7edb48525a",
+ "lib/wheel/vendored/packaging/_tokenizer.pyc": "bd8f1bd7528e191628eee4a60af880a6627e25082b90baa061064179f6744923",
+ "lib/wheel/vendored/packaging/markers.pyc": "228055651374e0fce2d1028c2ee2329d036477f8612e7f7c8461df245888d810",
+ "lib/wheel/vendored/packaging/requirements.pyc": "5832f8be94a3e36637d178361fdb6238cc6615a3dac85b87ba5122125b586723",
+ "lib/wheel/vendored/packaging/specifiers.pyc": "fb5885876cfe96e7f919214cfccf5b34f8db6f24396eceba9c954b0e860aa68b",
+ "lib/wheel/vendored/packaging/tags.pyc": "f980aa6a07ad0a705042bf45e8388c31ae42dad89d57dff698749ce4a03c32ab",
+ "lib/wheel/vendored/packaging/utils.pyc": "e24bb430b6dd9f2173963a48adb186a943bfe0880c80a075c0a68bc878ac92cd",
+ "lib/wheel/vendored/packaging/version.pyc": "297e14163314827e72eb966b89e9138fb70460d8ba42f01840fa442e333c72f5",
+ "lib/wheel/vendored/vendor.txt": "67610d8c1d62e69adf7b3f0274cd5276bddce99c6fdab451a253292e60677001",
+ "lib/wheel/wheelfile.pyc": "a0dbf12baafef3be74187e019dee395ca9824ef3d0968f7b6a9a840f1817973a",
+ "lib/xml/__init__.pyc": "9177d3232309c928dd96c85a62352d67c2f4c37ad3d07d0050f11f3033580c55",
+ "lib/xml/etree/ElementPath.pyc": "29ed4c81e659358d70c7f4bff6ca1245e9910335af6d3251256f07fe557fa354",
+ "lib/xml/etree/ElementTree.pyc": "0a27d4f191994bb3e513de25cf76999d8222b92995d3cf13049ee254d8180322",
+ "lib/xml/etree/__init__.pyc": "c328156773b33cc48527e36cb3a51bfe7e3ee245211d44bb83453319edc63a5e",
+ "lib/xml/parsers/__init__.pyc": "84386dcb76c6944289daa220e64121cfeaa583b437de812288c777003a94af91",
+ "lib/xml/parsers/expat.pyc": "f754e4e631df65258b21f58ba7c92d7a3c37a09762fe890cada7a77ff6860679",
+ "lib/xmlrpc/__init__.pyc": "b0744b1586f91f2175fb7cd0fff4f3c5d9f8c9750ccf11cc0f413ac72fdb17c3",
+ "lib/xmlrpc/client.pyc": "77eb247db9027e6ffdedd21bb3ec70af9f7d1d0c38691bbab1477bdc7bcb00e1",
+ "lib/yarl/__init__.pyc": "c69c8827c6f5f612e2af39d5a208c9fac4149d1bee8684e08de18f619c002c7d",
+ "lib/yarl/_parse.pyc": "c0431f57225363867c19d0a649525e728bfc21e1f688d89d16ef3e9fd38ab13d",
+ "lib/yarl/_path.pyc": "d8ab4a3ea6cd1ffaee11d977f2a38b762aa070ef447dab7179d224171b88850b",
+ "lib/yarl/_query.pyc": "452f0a4fe4258573359a1097550b41176f65a2810bf3eddfb028783b367ca04f",
+ "lib/yarl/_quoters.pyc": "2e8ec8ebc027dd2df89bf30f594d99ef813878761631a32b052746bf9a693108",
+ "lib/yarl/_quoting.pyc": "c9f5c3beb96cfce5af777258641a951794c7bebb92ac739b166fb3965b73ca7b",
+ "lib/yarl/_quoting_c.cpython-313-x86_64-linux-gnu.so": "3233ed1a24637c44884ef552f4b6f2760c3bbb2ce20163fccb51e4bd7f96470f",
+ "lib/yarl/_quoting_py.pyc": "f4571d0a4124be753ae1f6cc4913d1b391d6838ea7af18885a652d33a909d2db",
+ "lib/yarl/_url.pyc": "e6d30e37f69216da3c91016e2345d1863e51c6f2891997558d079a4a86405808",
+ "lib/zipfile/__init__.pyc": "746f936e06288779289b3b6c83035b2fa2eeb3b4f49893e03ff20da8b71a6e17",
+ "lib/zipfile/_path/__init__.pyc": "fbb6ba0c090a3c38f741e35e9d97b1fcf5b9f8f504c63e0963388ac2a46c958d",
+ "lib/zipfile/_path/glob.pyc": "6c0b0262f579d54a0789bf9902deec5ccc7146f6519bc92dd3138082414154e4",
+ "lib/zipp/__init__.pyc": "335ea547ffef6fb62b340f3f4ffd3fda13eefec54ffbd9b826db799f4a6d848a",
+ "lib/zipp/compat/__init__.pyc": "c9eb73e989db393939b9d9e1a6a320bbf3c7ae02afc38edfb0d496633ce17973",
+ "lib/zipp/compat/py310.pyc": "aa6211d9a469de134e78bad832b45f46d1e1c69156c133d2fef15e4f7d06feb5",
+ "lib/zipp/glob.pyc": "ca3801700493820e71ddc5f5526b83fabfb964212cfef5b46c2894a9f2c7ece6",
+ "lib/zlib.cpython-313-x86_64-linux-gnu.so": "b6da4d4090c31432d18dafd573115ff4fb83c07855e3e0652bba639f0cc4116b",
+ "logo/icon.ico": "f0ca1240f4bc0bc6dfdedb7bdd03b4e39a1b25840ad5166bb4dc67864fe5f247",
+ "logo/logo.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "public/assets/AboutPage-0IhYgVnf.js": "be97f886fd21bb730da22f3d86dd395c7bba9ee607b59320a399dbb82a089d81",
+ "public/assets/AboutPage-8fEiI5uK.js": "ea611e6c05060ab6113a5257fe1567289edcac8fcf7b8296f31b43a62deb4a39",
+ "public/assets/AboutPage-BKLttI6i.js": "b875d7ee84f7f21916109e655ecdbc9a2aea276e9dcdd293ea4df5ac984f6a98",
+ "public/assets/AboutPage-BMjlT6TK.js": "a819b1bd3cd16a9e724526f1b70e1e3b9122dd9e06593907d0205a4efe117cdd",
+ "public/assets/AboutPage-Baol2fuy.js": "68e8abd9d0a1f76f8ddd0b33f2cbb4ff3b9ab7091ef561565c5d73967a50db00",
+ "public/assets/AboutPage-BcCaFooV.js": "d963caa627219ce5688dc4d713711033e2660e5aaa48540295db17d24a5984c7",
+ "public/assets/AboutPage-Bn9rvwVK.js": "a6b193ef20eac72b320ceca8ebcd4bef596dddb493e96be21763f1d58bcbebbe",
+ "public/assets/AboutPage-BzBwKHSG.js": "f87555d7df8436a3ceb96229c75a9e577854c7ae83370d9e0b6b492d76831285",
+ "public/assets/AboutPage-C9JNCYeR.js": "e89333d84a9e990e25c89dcd4cb14604087d6c3f06b162e79a69a1658d7a31d2",
+ "public/assets/AboutPage-CHatkEki.js": "b790af35e013a477024c26cbcd8579ebcb319aefce9a1ec7fa695edeafe9e897",
+ "public/assets/AboutPage-D4r8SBwq.js": "38fd9844b860a9f32e72e89027313cc136e139d451bdee39fd971efaf77adef9",
+ "public/assets/AboutPage-D8YSes0g.js": "a705ef6cb7bbadcdcca2bc95fc41eb131448d1f639ef1ada24ccf4ab4a876784",
+ "public/assets/AboutPage-DAC1QiAp.js": "20cd57b43a7b3f84ff35e3c3b050d52eb5cbe17f222622176e8458c8c6aeb96a",
+ "public/assets/AboutPage-DCeZPdz1.js": "d488356ed2d2c4cf6bad1dc1a76fac40ddd5cf8ae9f15c700a2d86266be2990c",
+ "public/assets/AboutPage-DDJYGtfQ.js": "6824866eb30a454bf1ae261e399af0794334749f3fe9a4b57a4aba202d27764c",
+ "public/assets/AboutPage-DrUL2TvN.js": "a085bdafd2fcc7f374a8a44df7210b485fd887e373f77f7c992c6b32ffd980c1",
+ "public/assets/AboutPage-N2UDxc2H.js": "7d112575b42b15e099768502474e9351dc6c6187c7746c93baa407941eb16ab6",
+ "public/assets/AboutPage-cO7wDO0p.js": "52a488610c8761150402c5fc97a3fae6fe8ae0226a9e3fdeea48349948e1902e",
+ "public/assets/AboutPage-jCiPes_8.js": "290f1087991d8b33569e8bf9b3e94646c0c3ed0925186086dc19b5b00b1be40c",
+ "public/assets/AboutPage-mT6yCyKK.js": "560e6a3f5ac5837a50005ee2bf022bfbe081bea4edf5a2bbdb858cdc4c2913a1",
+ "public/assets/AddInterfacePage-8U5lyEuC.js": "a54d4e83b86185c420ff1ce8318ad3d5d1e0e7f770ea76a1136e4ccf63440690",
+ "public/assets/AddInterfacePage-BCtbSofF.js": "58f202f4dc213f5fa1e24d04c3a43896ffac4a6a4ba84252a1ce3678a7c23e03",
+ "public/assets/AddInterfacePage-BMaqdHgt.js": "405f581dddb488a46a1a38edfac866ad4fe74341d7a257176c65c2fd380cf0c6",
+ "public/assets/AddInterfacePage-BTcYysxX.css": "61dc0b5468c223aaff8acc47626e4284e72e07262b5a0a19d36707888f7208eb",
+ "public/assets/AddInterfacePage-BUgU4mHN.js": "0e93cbfc04d75845850fe092ad62a3728070dc94f41239d8031a357dfeab23f6",
+ "public/assets/AddInterfacePage-BZsc0GRV.js": "719d721bb9d8ede61d49eb952ba97921924a64c5f78cf287b8b6bf6cdb72387c",
+ "public/assets/AddInterfacePage-BdMCP1YI.js": "204a083e1dc0cc14eb6c6a4576c623d64c79b0a873a0fffecddb5eeb794118e4",
+ "public/assets/AddInterfacePage-Be5myeHR.js": "4d018cd57da9cec137655ca974763ecb13e3291ab4c58b8abc68663f09a0aadf",
+ "public/assets/AddInterfacePage-BmsAxVL1.js": "7fe441daea357e273d99cf203bb3a04639765e94905d78346f3a74784873c3fb",
+ "public/assets/AddInterfacePage-BqSlOb8S.js": "ff15f4d2720903de44609e10ee2161b315d2285d1b4420f02318620f2a3ca248",
+ "public/assets/AddInterfacePage-BzRcwDV6.js": "c8b85385f076fd7137a02c0104059492de64500281e54c809af820dc4c24de04",
+ "public/assets/AddInterfacePage-CHsX34aM.js": "c0c86def1cf79086fcf251f5bd56ec72e8a3943cd96fc94f1417bcf67a1ba6bc",
+ "public/assets/AddInterfacePage-CK7nWyjv.js": "42f25fcc18cb40dd0546b65c5f167aacbf40348b9511a43ca98bac1d6e307ff6",
+ "public/assets/AddInterfacePage-CYk70Bnr.js": "6e71d5bbd13d27dd77b08ecebef797d946d5b5336923acca7f62e6d050eddffa",
+ "public/assets/AddInterfacePage-Cp0aXqUn.js": "ded3735137237672936d6726ae6d75a091ad2a96e625192db1129ee657a1d9c8",
+ "public/assets/AddInterfacePage-Crr-YNaw.js": "2cd4c836089ea6aae5eed770e32616cf953a38ea6385e817cde4796d81aba9b7",
+ "public/assets/AddInterfacePage-DVuvwyDC.js": "4037e6751c12ff9db02915ad9f782fdb7729efec3a16a3fad6e313dd578e8145",
+ "public/assets/AddInterfacePage-DiEX5AfZ.css": "03ec87be159836fd2f2bc256a1cf6c19a206e6f0b6b17e3ae4f7ec6891687a08",
+ "public/assets/AddInterfacePage-Dk6b4P9D.js": "6940d4c0d65b20b9b4d5c937fdddee735c5c4c3df657a45f6ef62517c65309b0",
+ "public/assets/AddInterfacePage-Y5-VKBIk.js": "bf511802432a98c3bb2408bf9edfb6d75c1532a6ee26a7e6f38fb04ab02beaa1",
+ "public/assets/AddInterfacePage-udEolizH.js": "ce6eb44eea6d61b67562e9d69092634d7383dea1c4bef0a211f7dad7ae223462",
+ "public/assets/AddInterfacePage-zIW8kofQ.js": "a97fa4b221e628d246be8420d0c2508690fdc1c80d9140949c1b17a72a603f06",
+ "public/assets/ArchivesPage-3ZoRbsmi.js": "fde1c3442c645107042a8689e613225a9432926ccdbe03bdb75450fd50e6efed",
+ "public/assets/ArchivesPage-7LB1KeTH.js": "a22c8b1aa71747240dae715b155f4a1b47fe6c303fa57b9d57b5b4359c4f6532",
+ "public/assets/ArchivesPage-AaES3-lS.js": "f8bf7a93042bdf6b6532106886afd1455ed14fe0246589441e2b22af89f4b13b",
+ "public/assets/ArchivesPage-B15552h0.js": "443edf93cd2f63ea6c3223ac2ba6379321a06b32b9a25a2966523df5fd85c8ec",
+ "public/assets/ArchivesPage-B8bIEMTn.js": "2c4f39ff0cdebfd0f306aa40bd660be0f2a401137cac8d9188d462974b047edd",
+ "public/assets/ArchivesPage-BLofx5Zi.js": "e9eea40e43079084781a8df397c652b52b7049252b282e779cfb629b34abdae1",
+ "public/assets/ArchivesPage-BeHVXSmu.js": "7fdbccaa7c8d9cd2ba710824d278978268a0fd5d31ad43bd84f27a0ad8b9e725",
+ "public/assets/ArchivesPage-BoD5FNM0.js": "74ffd82412d7f1411283ce2a328d69f3afa1de6cf8327ccfbfbdb7d248c4b328",
+ "public/assets/ArchivesPage-C1yHbXva.js": "485a6363fd0229c6778b45a96121145006eadc3a4c1f531ce1264406a8161759",
+ "public/assets/ArchivesPage-CJFohVhF.js": "d6bf0fda552c71fdd9912ac5394401301ce71900bfacce94df8bbf2df3b0efb6",
+ "public/assets/ArchivesPage-CPxaPYQo.css": "f8cf0bf5a3d3c7c61b339e4246174b90e8edd0f01fdc87f5fd76e99c32b1bd5b",
+ "public/assets/ArchivesPage-CjWmGi3s.js": "9f9f6c9f1476e44525aabdc1cf6d2e1c6b2ee841fb85cd5a55e767abcc0930b0",
+ "public/assets/ArchivesPage-CreAUQ-V.js": "cd57436865376503b20a3263b1b014fc39ae59102910aca718f1979f57a5067f",
+ "public/assets/ArchivesPage-DCznv-zV.js": "d1a2a730f22790ef535db226771f70735cdcf14ca21104ed762e98153eb01641",
+ "public/assets/ArchivesPage-DQNKVWWo.js": "8be434387e152fb31cbbb5b32c0cc4b7ccb8c63784f80cc7163a11e45c8240fb",
+ "public/assets/ArchivesPage-DfAEykmy.js": "df01fe9cc5b6013e2a84907fb923edb87e2a22bd821b65638d1527ccc84bfc30",
+ "public/assets/ArchivesPage-Di-dIsoJ.js": "bdc86a5ca40adfcf7fd09da7f88450c0c77e65209b9ee0b9133511149af5cfb7",
+ "public/assets/ArchivesPage-Doi98rCD.js": "f91519241562cd872d3784d793a283864a131b8f85a3c598e58750abab64d400",
+ "public/assets/ArchivesPage-DqLN89ND.js": "70217190b4b707c524563a537bb08ee6a5976e80296f59185639fea3a55a05c5",
+ "public/assets/ArchivesPage-MQE8c1mh.js": "14d23fadb15611de351a698a2ba4629aae6db1f254398a351812b07dc2b1218c",
+ "public/assets/ArchivesPage-SegXm3vv.js": "aac23f598e672781342506f453e9d573f7924162b8f9f219f3664aae564279c0",
+ "public/assets/AuthPage-B8fvh-c3.js": "ef3b4603f62ae490b274b10b69784d2cb305cabaeb25494d5832e5801b45295f",
+ "public/assets/AuthPage-BQii6kbQ.js": "5e46fe0dd5d098071ed41146c0ccc60a209a62039fd481ee1915c5395e1c53ef",
+ "public/assets/AuthPage-BScK_nq2.js": "a227df74dd7e182188fd8d5b0a66b6e915695ae7dae21726a87e6fd3d7e3a563",
+ "public/assets/AuthPage-BWX5PNrJ.js": "f5e9e870e3c059a7203def71892fcd4603d3236e2945e3d4fb75bcc8a2be585e",
+ "public/assets/AuthPage-BagJfDyo.js": "bfb4fbd35bbe9dc6b50d9b8f1ba93109df451750ca3f662618580a3516ab4528",
+ "public/assets/AuthPage-Bfh9quB9.js": "da133fbe8bb18280d2c53d14853d6bae92786b91237297967ec2fd4507c46845",
+ "public/assets/AuthPage-BytNkU35.js": "1c1c7fb89f0ef26f26bfab5e20275e838d3e16bfdf6394840785d94ddbbff160",
+ "public/assets/AuthPage-CFC1s3eA.js": "a2c0f1f63836817e708a94b54ed4c66620a46684cc53e0c7b69d8de5856642bb",
+ "public/assets/AuthPage-CIDofeln.js": "c6087eb9c56f4350fa098ad1e1d978045244c08382f3483b12880c03768bc36c",
+ "public/assets/AuthPage-CbO-FPqt.js": "40b5a6050fde24bae4afd6597e33ec1d01a46577613956e3798cc2ba9b969177",
+ "public/assets/AuthPage-Cl_ZNA9t.js": "de9b317c4abb001603c5434af2f19b7167c2feacc826cf828a0c1bb5f3833929",
+ "public/assets/AuthPage-CnLp5Bef.js": "ab3beb2fbe4a68f9a8e790655cd3a164f25c814f4146632e7a47ec90ee933f0e",
+ "public/assets/AuthPage-CsBUr8cw.js": "70f63f63b6ec11c27baae6b832f371e85ca2ce6394b29271eab9d717f6da4ac6",
+ "public/assets/AuthPage-Cuw13OWi.js": "c9ff77da541874cb4700f1723136ee746f49506162671cbc2cee4b9f97fc9c5c",
+ "public/assets/AuthPage-DE_R8ybi.js": "65b917ee43a2b8e24d78266a688fa6bb7e9709997f7dc1a5a351ad18f6981c95",
+ "public/assets/AuthPage-DPOdVS_2.js": "313265c078c81380fd4f5c59611c8afac6aab58e86c95016a55fdee8533d42f5",
+ "public/assets/AuthPage-G6XYwO3I.js": "e690d7c33cac1460e97230c971009cc32082e5be7929c992a271d8b87af4c641",
+ "public/assets/AuthPage-XSiZwR92.js": "a3641bde2eaa53c066c108c4f5a186497631edbd4b75b32b8449e46ee718573d",
+ "public/assets/AuthPage-d0SgjC6f.js": "913b4001bcff6aa1a0c09493294be92101d1a2fa43b3aa55fe2fb13da87c4d4d",
+ "public/assets/AuthPage-mqiDR_K5.js": "516d1705303c381461be758da87a3e9ef065809bed5d2588d4841d8df8a88f68",
+ "public/assets/BlockedPage--w5BAQVc.js": "afe83111a422725f289dfc6e2ceb04e37e6e30ca2cb5bfd94a062b5ab7a1725b",
+ "public/assets/BlockedPage-BKlUYsLN.js": "9acc91d041d1592316cf7620ae9fbeab79cc5e16970cb162c9345a1052570118",
+ "public/assets/BlockedPage-BOvzaN_C.js": "7d6b544b81c5113c166616d4fb3dea5f02036b3443989d947553fd03af44f4fc",
+ "public/assets/BlockedPage-BQwf8_om.js": "b2c148b9f9142f82d56033258fcac4af4fb761d3cc61587016c37d3b4480678c",
+ "public/assets/BlockedPage-BSMLtAQF.js": "8cde5e3b110c9b2d5123d7939fb7ba9b8bf1679e853ed27ec8aad4ab0e5e1089",
+ "public/assets/BlockedPage-Bb8MI4BS.js": "bd992e2c9e7a5346b00bca857800a023b8f2c9d159f3aac8e8d22bf108d93b63",
+ "public/assets/BlockedPage-BbR4aTPm.js": "3cfa7a06970b0f7a143436239720cb04bea09e16393a453cd59019d7c845f2fd",
+ "public/assets/BlockedPage-BcyInvbm.js": "6dfe1f392487ded7f2455dc75497b5e588c1e8867b667990c2cc038a4a3a5b21",
+ "public/assets/BlockedPage-Bl6NIBrb.js": "b8b36625b41a0156a4819c9abf392734d4030768dd3c7c89b7f72c93421db8c0",
+ "public/assets/BlockedPage-Bogen_i_.js": "9d7ebb2b710eaf14e769b444433748692759c8662d22aecb498e8fa5289d28ed",
+ "public/assets/BlockedPage-Bve9i13H.js": "4ae68ec7f8f4b7c2a17a086c4d68ea247cc9fa55b5fc12a07660162b4c0b388b",
+ "public/assets/BlockedPage-C70Xjfnm.js": "d12008d486e83ea90dd21583c3b9af0f323af2faa04831838ec4403925786c91",
+ "public/assets/BlockedPage-CPTT-CSB.js": "cad34fe06f109b33e4ae7b1cc796fbd7a2411d93f689f5521945e4bf70d99546",
+ "public/assets/BlockedPage-CUTBR0Kx.js": "39cf9f0af4bc86db7fa3d5bbe3d2c97d901b3e034031278d4f0bb48d18d6c024",
+ "public/assets/BlockedPage-CUv4mTjv.js": "551d31be0d5b5306335be88df76ed1dd8d013ed980b48fd4dd07702cc8903346",
+ "public/assets/BlockedPage-ChJxX-YD.js": "fbf75b23bf09b612f8f9bd0a80d03e7ae1ed88095963635d6d24bcdfe94c8859",
+ "public/assets/BlockedPage-Cj5wW2JY.js": "aa8223bf9f1909465b89b22f76749a991c39bb783ec27b423bef12b0a6b2cf64",
+ "public/assets/BlockedPage-UO9kbItm.js": "51cd72d47cf9782036188b0ca22ea85fbdb63759a0adbc3a7f46bbb881a35270",
+ "public/assets/BlockedPage-fglMXFtz.js": "edfbefbc2caa6fde26004a5eda5cc41ad27ac1e3b63e9d52bd365301934601b3",
+ "public/assets/BlockedPage-nnfC_qop.js": "0afd8a8d1ac138accc46df7e0e3cf480fbc4f0b84cdf712aa14d3bedc9f17fbe",
+ "public/assets/CallPage-B9A5VbTO.js": "d4a90455473540966994d4404557eeecd37318ebefc4787b31f12e244fca3cf8",
+ "public/assets/CallPage-BRIKPbmi.js": "fe836a0cce17b7370e7deb03cb8bcaa4272bb81251981eb4047263951b0c8388",
+ "public/assets/CallPage-BqqYln35.js": "b9b149e7a963374a939b2b6e5e66c75eca77906eba091441599e7be0e573de61",
+ "public/assets/CallPage-BwAxhKKp.js": "756ebc63cb1e87d716d8d46d47380bbc1e1f10de8a6a8c469190b91af4ad11f8",
+ "public/assets/CallPage-Bwf3B1oK.js": "930180e1a993f6252e56a9d74ffe99553fc652341944ef2e549638a987f5beed",
+ "public/assets/CallPage-ByNY39ve.js": "5f4f0fb49fe376afcfd491661f7d9959c382a3e9c453901ebd2797f1804ed740",
+ "public/assets/CallPage-C5kSsHhI.js": "73c6790c08a44d3cb9131b4990420483fcacafad90d1c58c04e92837d7ab046f",
+ "public/assets/CallPage-CkKTpT7n.js": "bead262cc1028fac6fc7660d854a3db3f383cabe202e9667c94580e71ba53ff7",
+ "public/assets/CallPage-D4jb_f8Y.js": "2ff9e913d7e05765eed2db1beba525cc17f17eb6cba0ec4bd92bd3e167b76e55",
+ "public/assets/CallPage-DAGAK42u.js": "4e0045609ef9b149388d2987d51fc58b22ed12a3382cbb228abeb0d532680862",
+ "public/assets/CallPage-DD0NVwu4.js": "750449435b386e063260c66e8f601de78270cb333d0f5c476c077117da21e02a",
+ "public/assets/CallPage-Da055DPT.js": "a4c3f0c7185ecd3a88cb40f41ed9bd46c1fce904d920a252e7e8046827f32f75",
+ "public/assets/CallPage-DcfOes9s.js": "b45be33fea18b0ccef9003690e1411896ec9a9e9913d92d2ad2be17d777bbd33",
+ "public/assets/CallPage-De8paHKH.css": "8f3c50ad7162d9ca7f0738bf4714eaca03b36f1f609ba158b7d8d7344e6f7ad5",
+ "public/assets/CallPage-DfOmVy8A.js": "7eff0286f3df1c2d74284ba9241bb5919d69947a7775cd717725fde5804cbefc",
+ "public/assets/CallPage-K4yaGC9s.js": "c996db74e2c08d8f08beffd464565eff597d96d1ae75a74250a5bc28bd08984d",
+ "public/assets/CallPage-dxJwwjb1.js": "02c8551f07a3c93cfbf5f7af1d682dbff5247876bf8ea1b322a8560c89947b10",
+ "public/assets/CallPage-iNLpjZ37.js": "2ecdf1321a3382783e66df5dd61e4fffb210c7a2c9d8c34be236f279d53a2f32",
+ "public/assets/CallPage-k4WQa0my.js": "453bb574d9473f8238a5dd0b8505dc98843cc24f0ab6aafa09b6ee7521938acd",
+ "public/assets/CallPage-pUEXQpMp.js": "8de02a002921ae84bbd595b4ecab0df71649b5fe21bf359f71348921b263026d",
+ "public/assets/CallPage-yAxsVFe7.js": "83cf69b23964fa3dbf4a0cffb0caf7af66e4a289d2d586763f3ec296082c45e1",
+ "public/assets/DebugLogsPage-4zJ9O4eQ.js": "9d4653a52e93befc50cc6edcb19c08920411e4f8364a3854cd697be6bccdc063",
+ "public/assets/DebugLogsPage-5UW3nsMS.js": "a6e0960ee21d89409dbbf0e9b990d1984269bb9fb9468873645d3e1391b2bd49",
+ "public/assets/DebugLogsPage-B3SOBo9X.js": "a3d20f64b34b7a217a1cfc0f525547d31e5c78072233fb782d44bc1590e1f60f",
+ "public/assets/DebugLogsPage-BNl6PdKw.js": "095ded4961531b67392ef7127f5cfa91459a5221464f2fe2e8c80eea5f9e6795",
+ "public/assets/DebugLogsPage-Bn8RD8Zg.js": "5a3e958cfcffd6ded7a45c719827cc400fa9a018d666ef96fc9fe4ceffc57265",
+ "public/assets/DebugLogsPage-BxPvNzLG.js": "16d67d2d2a4d825360c077d7529565958506923b539436bc756398304bba8bd8",
+ "public/assets/DebugLogsPage-C0L8VN9V.css": "7e293009b33eae8b7b2ebdbc0b37b7a6c7e10d980f9399145ddbbc171bdbe6f5",
+ "public/assets/DebugLogsPage-C6xFRLE0.js": "e9d2213c42749b082dc182c1e190314f5ba52f6bd88ee051f9bae285ffcedd95",
+ "public/assets/DebugLogsPage-CDvs1-mH.css": "c974af1f0bccc095e14ee2d34861daf60fc8b5af95acf50c18687c48ad132a23",
+ "public/assets/DebugLogsPage-CP3MkkCv.js": "c762f17081abf972b557e111546f666033d304cf0e67374d95e08e0e05d17206",
+ "public/assets/DebugLogsPage-CZJEcwRM.js": "1aa967b389ad8efe5d529ad13a2b4613526f185c358a43412070e7a1349f91c4",
+ "public/assets/DebugLogsPage-CcJfflzG.js": "3f650e18c92aff0ad7ec979d4b4d2f2ab335944176b00eedaf22c74af1b27264",
+ "public/assets/DebugLogsPage-Ce4ZfS-b.js": "019f27cd38c96ca22f4a4c2b8831cf6d6b5fe4d66caefd00f11e60cd22400068",
+ "public/assets/DebugLogsPage-CevruSTZ.js": "3bd5f85166055f20c93cc52ff2127701309f4c6339f22fe2b9e62449fa25af1b",
+ "public/assets/DebugLogsPage-Cs9qaJhW.js": "d246ade48fce67dfcd40621f4fe907415486d801480a0c4e52f4e74a5a96397e",
+ "public/assets/DebugLogsPage-Cy8As8Ax.js": "998ae00f250b91067b7060bdfc380580e4799114b53ac391aabdd60a4ea91143",
+ "public/assets/DebugLogsPage-D3P9cvkP.js": "1a0c5af94a21032a9d48865ab471131b32fbdc3a66a316e85e6dbaa730792141",
+ "public/assets/DebugLogsPage-D74Sftux.js": "97ecc1b085a5284fa375a039457c3b4c0e5c55aa0c425b2aab06156d280b5df6",
+ "public/assets/DebugLogsPage-DehBhZqo.js": "80e0cadc8d7d66a1a896cc9fe1b69b1b0627be083393b2d32c4678645f61eb42",
+ "public/assets/DebugLogsPage-Dn0-LMnJ.js": "b68d5ea0b6fd21006400f3850137bd8de9f740faa39407b64d837029cc9ce86a",
+ "public/assets/DebugLogsPage-Dzy3VE6l.js": "3a8dfc210519a32fc18817a28a03bc765429a063a2ca689b8ac9273d4c7b5265",
+ "public/assets/DebugLogsPage-gQY3fUF0.js": "147125c86aa4fcdbe729a86f66787099c5f0c5ec9b6ff407f280f1f841efd1f7",
+ "public/assets/DocsPage-2_adKWz5.js": "e5b89209f8d2a62c89e263469111f0a2d0d196b6879d96d4d6ace990d1a08e07",
+ "public/assets/DocsPage-B-m7mgh5.js": "f8b24884d2240fea52c8c8213195745aeb25b2ca8b77a773de4e47532f567dd3",
+ "public/assets/DocsPage-BEg7eanQ.js": "36ff4f8aaa910e62c8b5e0c1369952cc4376eb8dfee455eab2fb2da90ad34803",
+ "public/assets/DocsPage-BKOCiRrr.js": "f2f93c9dcb1d75d91d9bbc6c91f50f44a8daf0407b4a449fc1d7a9f54c4beeff",
+ "public/assets/DocsPage-BS52EMoo.js": "49d15c52092ee5bb639e04ea3a043955a5ae65fa51abe02e1f26fa8e05958ce6",
+ "public/assets/DocsPage-BTY2zrzo.js": "efac452791ae3f908f1a01ae071bd47380038b86f63ce67b2ded287ae5c81f10",
+ "public/assets/DocsPage-BXX9iq1d.js": "9a6a297a95504b6b32fe96b6f09ff3b756ff4ae3e5f73a8a393f96caa270a515",
+ "public/assets/DocsPage-BstDjHTu.js": "389e9c0144ddcf099fead7044caf9d75a178b6eb7058701f3d7e61ac59460101",
+ "public/assets/DocsPage-CNRrTRn2.js": "bd18fab4cd464a806c56dce2e1bfd4d42892a5f6e89d4cef9bf09bbec9f5b570",
+ "public/assets/DocsPage-COB1YgpN.js": "d3efa697d7e41103982dfdf907bbe71185f5d3737a51c3deedb227e34f34393e",
+ "public/assets/DocsPage-CYi8pzEM.js": "907e925475080cf1e4d92740d00281c3581d5afb149822c17dddc00950b37e79",
+ "public/assets/DocsPage-C_rhvfLw.css": "8fbae748c54f0d0898d860634da36f5b8556351db68d72cc1a6824b2b5fa8d87",
+ "public/assets/DocsPage-D4LG5S_A.js": "88874fe49a120f0fe8a302268f22871a7d13ae3d4af568d05d59c3c6bbd962df",
+ "public/assets/DocsPage-D9i9itaR.js": "8696f8038aa7e16f50ea7260e5954c47af7b8b204dbebb821e4487608d3753bd",
+ "public/assets/DocsPage-DKNLCnf3.js": "a144235811aee1e8e77c7b6edff3660233f96308edc87b4be8bc68e39c5a2266",
+ "public/assets/DocsPage-DZnaYyVW.js": "63daacfe84767a03c02ae3b21955b0ea0c5b2b4df39017f532f07bc23aede3e0",
+ "public/assets/DocsPage-DcP31Aw9.js": "9a37b54e11a8fcb5562133a3e4dee291cea99e846e45ae7c93dcf5d7e428129f",
+ "public/assets/DocsPage-DfBdX1MN.js": "6d8816b65a3ea61eed13a19f4ae976fe59355b5b79db89d499385fc03c3c1847",
+ "public/assets/DocsPage-Dq-wqU-E.js": "1262db491a0ddd6a242267d58856707d1de4c475b1353b9371b17aa32685b562",
+ "public/assets/DocsPage-DrRohStP.js": "2312be0223d4949903f600dd264928c304896bb141d93e6592070b9153be7f87",
+ "public/assets/DocsPage-DxRL1MsW.css": "2727fa188637b6cb7e9a5f854bb64f00052ed63731865bf349b323048e20d948",
+ "public/assets/DocsPage-ddW0eLHn.js": "7d0a9a47baf19596d8fe6d0b7212afb76cff464031a63cba6f9ee209b40d2e49",
+ "public/assets/DocsPage-hDlg1Y9s.css": "49d69be6aa44d8d062396fad2278d54c9d1da81d18d5a5b9d5c64d8329a3f04b",
+ "public/assets/DocsPage-yrWtkKMx.css": "a0c64c62a6e8cf347bf8720ef650cec044115cc70782a64c4e0755409c48e050",
+ "public/assets/DropDownMenu-BRb-5XM2.js": "0fdb2c12b97d1405c07be38da940815b2302f951418c1cd501a86a69f36e79e1",
+ "public/assets/DropDownMenu-BSIRDIhA.js": "280ab9ee2aa11071e4835ce1b7064c3dd25649aef321b11f25cdcb42f8835a32",
+ "public/assets/DropDownMenu-BTUTU14_.js": "dab91982ba3e31220cf86dba63202015c4fa6c91cafd28cd3764f1a2130d0374",
+ "public/assets/DropDownMenu-BV2CC1ni.js": "00dd4f073a965582f227b43cd04c836791323d1e958922457d32698e5a711b73",
+ "public/assets/DropDownMenu-BXmJSeiu.js": "9e22d613436eedb7c468b6386597c162928fb1cb3a0fcb04d6fd0fdac3a47377",
+ "public/assets/DropDownMenu-BwNpCqI2.js": "3b4a947ba178592addd831612cf2566c4f8fb270ea7f23970ecf49050c2639b8",
+ "public/assets/DropDownMenu-C3oTXFDX.js": "45bfdae74e0a7208bdfc1cbb8a0ef5b476fd38fa87c26034e8ce3f7425bc269c",
+ "public/assets/DropDownMenu-C4IqVjVV.js": "5825129c0341007a531725f77f8d9c9f9ee0adc2e1be1dd817fafe6e03961c33",
+ "public/assets/DropDownMenu-C9ic1-Kp.js": "c9e1b41300d8bd68e2362331821ca1681203f30a098faf76b16ec9b78eeaf332",
+ "public/assets/DropDownMenu-CCJZnVsh.js": "e5f950f69e9153793b9aaaac57ff0c37ea2f3b4ca29754237e4d7030059325bc",
+ "public/assets/DropDownMenu-COST-XEn.js": "474565edab04754aeaf1f2af6cd5d4e4aa8aba47f5aa624209d76b42b00f2081",
+ "public/assets/DropDownMenu-Czu8e35G.js": "d458923a01f011a92bd04b5b7d8e3a6711b23821fb0ff30491d80a9497d2a466",
+ "public/assets/DropDownMenu-DE52OS4K.js": "2d777670085486fa390e57c19ef9f818f8cc4f68766d95992201972142484fd0",
+ "public/assets/DropDownMenu-DTkGrpcz.js": "c902ba83ac75299c8fae12753b8cafd1ab08943d3d51238db7beebe7463a26c0",
+ "public/assets/DropDownMenu-DiaJpxda.js": "013d798b58e1ba50da4355ef1a70799005cd72e75a3a3b42440ff9fb59fc9e90",
+ "public/assets/DropDownMenu-Dt4WcFld.js": "c84fb19e2f12e38aba20d8dff358cc5bf0f4b962dd0e25e3ffeff9fd31329b66",
+ "public/assets/DropDownMenu-Dtgo4qDk.js": "77e94d3864978537c1dae82c8f92cd11f778bdda1f0ba9c0f7d45fb4c0ea53d7",
+ "public/assets/DropDownMenu-Muyb_dgX.js": "a24c874efd47d0e5d6aa87ee98f0249f7b1bcc1ef714c3af8410062c4bde056f",
+ "public/assets/DropDownMenu-OitbrUhj.js": "0aee8c48585c6e8a63cf1c74b6f938288e0bf103c0bee051d2f710d66ea9f261",
+ "public/assets/DropDownMenu-ePZ8FLXc.js": "87cf5654c0d3a008b929a51b78fbe17c1870c3dac140b0ed753080ba8dfd7642",
+ "public/assets/ForwarderPage-ASnZ1fk9.js": "7f236bfc466b3f1d7c7c708a71bb9e63a9f4df478f6c8f3ba8a4a5fb7b0978bb",
+ "public/assets/ForwarderPage-B8iqJoSA.js": "ff127d7a026595be6f57034f2326749430eecf56a27b9c314b7f55a652742430",
+ "public/assets/ForwarderPage-BMLJ8L8K.js": "74c1ee101d3458860179c6bea6764d658c6b865e99c8c3f980444fe507e95768",
+ "public/assets/ForwarderPage-BRot3TI7.js": "9544d8f26f4479e386f429680d953494cc754cf13f3b71dc797f42cb8082aaf4",
+ "public/assets/ForwarderPage-BYX9iOuW.js": "53f8838207db7e588cc6b8e8fbdd2acdf9474d8ea89af9703d78c0474b22351c",
+ "public/assets/ForwarderPage-Bh0rnH3g.js": "76f3f0accff62acdbb77e4c8c5a1d26746d0b3e5efb8568a4a79868d1ee5e0e6",
+ "public/assets/ForwarderPage-BsOm3cTt.js": "330665ee3b4e3c2fd5a52e55fb66ff655faaf94ac462638d877e834e9005c429",
+ "public/assets/ForwarderPage-Bt0FsK9I.js": "a1c0e218aef1f0cf3743aeaf70c78d46e9ad0061d3947d62c2b1800842bc5922",
+ "public/assets/ForwarderPage-CBP8CERR.js": "7ae9ec04800f07619bb1e929f09bc2e46d80bd4274073380213077a7055fcd2f",
+ "public/assets/ForwarderPage-CHhMqC1Z.js": "ed8ce04c20195e56b4250e31fac01bd42190bc6262701f2700dbcc0b8b1afe1b",
+ "public/assets/ForwarderPage-CQq9bhew.js": "b6bb0a2be97e33b41823464e42086dd33337a9b5a85b57d234e6d9f667f11170",
+ "public/assets/ForwarderPage-CbhYpLxX.js": "adc51db70a275fe19deaee1aabc4bac2df85d5677915cec0d554bea5fc8cd759",
+ "public/assets/ForwarderPage-CguUvBJJ.js": "a3aa0d7f2995ebfb0ee52537cff5b782ca032b8c9eb396327ecfb68ee111dd0c",
+ "public/assets/ForwarderPage-CnvdX6oJ.js": "b96d61b7742e46407d42a2ba9e5f26442855bdc76f2b72414dc98c5d33d8adcf",
+ "public/assets/ForwarderPage-CozsIxph.js": "1059df94b80eaee93b4b6da6ac381864feda3ebc4df685b08c2f1b7f1bd8f8a1",
+ "public/assets/ForwarderPage-CvBwYLAT.js": "72180d2d5dcd43842eda609a9a10f476fbf3590e338f354a224324cfecd0a42c",
+ "public/assets/ForwarderPage-D143y7qD.css": "c58183223cd2e32a62ab89be2dae42b891a01fc94832abcf87df2dbff8374b5a",
+ "public/assets/ForwarderPage-DF74u1Mk.js": "7ef45302504af0d69e4606e8deeb76f17c4fcbc22234511102e2c5f9c46ef0c5",
+ "public/assets/ForwarderPage-DShkAayA.js": "75753c0e310f07963b34d2dba65c80f44327e87dbbe880dd4ad58d9604bca561",
+ "public/assets/ForwarderPage-Y7chGBck.js": "0c5efa10fc520c03ec748f80e59a10f8c8a6c8542f9032e8d495e1f3d627dab1",
+ "public/assets/ForwarderPage-Z0455sJm.js": "abcd71db6571b1eb9b33c8d3c0795a562f0a960c5e1a4a9ed92f3d151706cf83",
+ "public/assets/IdentitiesPage-2u5Olo1e.js": "dc8bb5d634d244eb401170bbcf5ca96d9aca886d542998fa0f7c6949a73a8b49",
+ "public/assets/IdentitiesPage-3202l5tg.js": "6fd6e09cbae3288e2d421deaf960fb6bfa807685612297b5e49a886df85d5d04",
+ "public/assets/IdentitiesPage-6a2u0dbv.css": "955a6ccae0fbefc482b24ada826c8a3f3005980a358ac9ecfaa461d078d50da5",
+ "public/assets/IdentitiesPage-B6Ryy6cT.js": "eb46b7f3b6519dc9f6d47dfd5caf2c0432d3f71c1f204b02efe3f099160decd4",
+ "public/assets/IdentitiesPage-B7rMKJwT.js": "a3321e4ada43934ea9c0a49e1f5769e34f88459debc782bc3cd51d7593beb114",
+ "public/assets/IdentitiesPage-BBn2a3pF.js": "9869c8c075800e1a49f7a23b5c25d6cd5f89d3fa9892dbb3480db355b857dd45",
+ "public/assets/IdentitiesPage-BD4TvGn4.js": "6b35f365d95b39e27cc7656dc7a073a9ce190d5a6e4cee843dee745a2845a860",
+ "public/assets/IdentitiesPage-BT8t-ScD.js": "538e27d9b02a2bad13b56f926bb72c6500e8c6f56f6778948c70cc872049905a",
+ "public/assets/IdentitiesPage-BYvn1GRy.js": "5d7cfbf16828a8be6509135f0261e719e43f09f366c6dd2877d37dcc149d6a4f",
+ "public/assets/IdentitiesPage-BmUB8ygV.js": "f7198ab68c28ff6e7761632a2b0e547b919eba4790973aeceb78c46ab142140d",
+ "public/assets/IdentitiesPage-ByIi0vE0.js": "8a12361618c8a15ed6647ff1bf92f5d9c8ca535fdf0bd47b22386e41eb6d4c61",
+ "public/assets/IdentitiesPage-C1Sqy8sn.js": "1c98bd91885c79c991a68aa49700659c2c5083d2687b2795abd52fa7ea825b94",
+ "public/assets/IdentitiesPage-CFFXsLLv.js": "7c53af04f56e8422e9c169f05602ff43ad8565da025a7be41c1684470883fc0c",
+ "public/assets/IdentitiesPage-CGgBXv9v.js": "6dcbf64447789963e7e83e880162d52f417a2b3afd0a35efcb84c0e76037b85f",
+ "public/assets/IdentitiesPage-CqU8xv8N.js": "13bdf898258cadf1b237dcaeef4b342ccb8b32d4d5ff6f655d3e0e3c8624029c",
+ "public/assets/IdentitiesPage-CsDlV8Ey.js": "9ce634bdb2108792f1c2f1adeb06ecf80fb52f9c3c023d2bb83435abd75b871b",
+ "public/assets/IdentitiesPage-Cz-Lldsg.js": "20b1e9061348169b31dcc7a2dda28495946b57c291f9af1ae8c171a433a4d0e7",
+ "public/assets/IdentitiesPage-D2x-Np_g.js": "000fd4d14140f5e939a971eb85b2adc3cb33747fa85fa27490c002cb6cf3b75f",
+ "public/assets/IdentitiesPage-Da7yzPOK.js": "77c314f43a647fdc64ebc84bc0572832023d3ead55c26135d8e73967cc1cec14",
+ "public/assets/IdentitiesPage-DcQ25KvW.js": "9c73fb8c7906e36ce19da94be0658dfc4b6205d90e358ed1f85bde3c957ef8d6",
+ "public/assets/IdentitiesPage-DgA739OZ.css": "64ff5fa2623696104b41f9d70010c4700307fc77d8851f0fd6a38e13df926f22",
+ "public/assets/IdentitiesPage-atAVP6Od.js": "242bf7c16efb2d6e38c4ef24791a7de2ce1e362bf51129503fb843747508e264",
+ "public/assets/InterfacesPage-4MWHd8dj.js": "14b9ad609180af4211beecc2dd6bdc03aa769c30ae0a8777481918fc02b4d100",
+ "public/assets/InterfacesPage-B300_rSy.js": "0e6f6c305d1f3643361307304701a4a3162af9af3f8d9971e3321d6c54a3cf75",
+ "public/assets/InterfacesPage-BAUi3br-.js": "ab9d664fdd1c9c0671074d8db6c3efd68e8fccf7885e84d75cf76df33a2655d2",
+ "public/assets/InterfacesPage-BE69gBFL.js": "f54210b1b611f17cdcf1ad3530b6bfa05df9751518755b32e7cc0a8b86c02f48",
+ "public/assets/InterfacesPage-BGTCDXHz.js": "0a2330c449c6abacdb5292d0b60d1248b020b81945d67178754b545d396e6ff3",
+ "public/assets/InterfacesPage-BPjlbmnf.js": "11a0f91d1a7bf462cabf22ebed6201f908d00e95f03db799f4aa4b969a558f04",
+ "public/assets/InterfacesPage-BW-HN4Ty.css": "c1bb16c277c10876ee2e1b3c170aee4129d69078ef64fa8a1cdc256213f79eb5",
+ "public/assets/InterfacesPage-BYPjrZcT.js": "e3080bd373af904971e3f00c7d7263c186a0a57516cbb8f0a222d4213e378a35",
+ "public/assets/InterfacesPage-BjDKDL9X.js": "1b3eae8280e260cdcfc9fc5b3fe9da188f9094efecb0bcc958d772174d497afa",
+ "public/assets/InterfacesPage-CA8G16Gi.js": "c6af69449342a56592151ec3e768c829763989f2753dc5a3fabf3c5ba3f70862",
+ "public/assets/InterfacesPage-CDwvRlY5.js": "0ad1d3f4550df6c0e8476e78f9461102b11d7d3f33069a2bcc13e48438cf02bc",
+ "public/assets/InterfacesPage-CJb8W80l.js": "48c9ca5acba4399b805a3d9ce94d8c8f9b3b18b45e87b850a0ccd7a7d79ba0bf",
+ "public/assets/InterfacesPage-CKI4gY94.js": "e8ee4a65e71c7607b5dff78f3220253ec83697519ed1b1147fcadf88573a0566",
+ "public/assets/InterfacesPage-CYmlWTfK.js": "c22b12853a76517e5b1c5ae4eb45115283ad4b1d7373a1b28ec166a5d1a46db3",
+ "public/assets/InterfacesPage-DdK02uqg.js": "b3435163b32495ce97529aa8551137f478c4b026bd40069c127d9c0ea6b8bbdc",
+ "public/assets/InterfacesPage-DjKGl6a9.js": "bc94f216c405ddcc0b15cc9d76068d4e8f9224ddfc42bec581ac747c77e6ca22",
+ "public/assets/InterfacesPage-DlDyC-7K.js": "06ba8d692481ebd666841757d09817434f732aa85c6177924be0d523b8961cec",
+ "public/assets/InterfacesPage-DylPN8vf.js": "d65ea3603bc16a3a52ab34225f80d4610b22f9a27e2c6be0bd8ad6b7155361dc",
+ "public/assets/InterfacesPage-cVtkeZQp.js": "7043132cde70233b1e79845396fbb00d7307f8d293ee095131b4be7c920fc487",
+ "public/assets/InterfacesPage-fQMOZ4y9.js": "15368c12a9801a265237d3f3bf8b82033833c215b486b7ba45f566caeb9eaf9e",
+ "public/assets/InterfacesPage-s-bbz0cT.js": "4d0d337c473046a6427528cb1c942d3f405e5d3f1a4be56260e7fdae4318a18d",
+ "public/assets/MapPage-B0XYXEb_.js": "0b2865d8cb6abf6141b728d858e310c572c75972ae534b84c82cbd6964b1855b",
+ "public/assets/MapPage-B6E4IMGb.js": "2ea7e8547d4bdd512fdf213c3e4e262e9fefe4268ac0830f4ae8e6e70059c23f",
+ "public/assets/MapPage-BH_84XDd.js": "227048268485cc3e2539dfee1bd2034751da3b95bcbaf734068c0f0e324ca949",
+ "public/assets/MapPage-BJq0AFv1.js": "1d379b48d6f5502f3ba4af4a56d29adb387171aa546008cd5b22c157fdfce088",
+ "public/assets/MapPage-BLd4rfbi.css": "ba3e4e77c15d60098baf9097fa691e517a06d6caddf69ed1a03a5d8617a58c8d",
+ "public/assets/MapPage-BPQ-qtZn.js": "f735ca520d41e7839dd398fd1e1e58e4ff3ce629f85e3ecfeb37ffa604cd7957",
+ "public/assets/MapPage-BXb3DCaj.js": "4bdeb6c11209f0851ffa56320016c969909825a0fd928310702809c6c2ce53ec",
+ "public/assets/MapPage-BZ5D-xHr.js": "8ddee5ebafcee1cc7e62cff2507951a69100d0116a6b0fbe5cd05e6be50a41d7",
+ "public/assets/MapPage-BsSuGB7U.css": "363b6a79d3006ec1f9d7408f68d1e74a4913f7d4c2fba8b5f9365ae22ad63732",
+ "public/assets/MapPage-BscXmA_E.js": "f92d188c4afc28dbd0a36a1fd0b9070bc64d90707fa0d2eefe0cc6f869428a7e",
+ "public/assets/MapPage-BtS0PlIc.js": "420ce457cfbfe878bc492f55e23958d94213251e7930a21f549b48fc91f83c1e",
+ "public/assets/MapPage-Bw5IYwuF.js": "02ed3ef11aac8d4166699a2892b8000d1dcaac7718052628607b3173c6046f16",
+ "public/assets/MapPage-CMFf7rDs.css": "6ac1628fd5ddfdecaed27cde430856a39876ceff82b7ffe81e2e71c275d174c9",
+ "public/assets/MapPage-CT51EQsq.js": "8a15a6349c46440ab2b0ef88827de3b87d187798e5b95322a5543293be1fea2d",
+ "public/assets/MapPage-CXzhmmQE.js": "b9e431d440b3a93fc4f29404ee301c306a07fbe9883e430040ec0d4a94d1a565",
+ "public/assets/MapPage-Coz2HXkW.js": "94722dd14c824edec7f4ad474afe4bf6a97e8716529feaa6efff071301f46f69",
+ "public/assets/MapPage-CvnvsezB.js": "4cffa5d8b88e29a32e1282154bb99b5ee927430e7f703571a15a5ab6ec57f65e",
+ "public/assets/MapPage-DNKwPg3D.js": "c7ae2ebbbaf1c63e4434aa1e038e7c8863177b067259ef2ee2c855c0e699a45b",
+ "public/assets/MapPage-DrAjZhQB.js": "4fd9573942b463b55a0fe2b71d53e537714699d759a385418bfa6ee14b60f7e5",
+ "public/assets/MapPage-Eo71eMvW.js": "ee05b8df42b77309edd1dc7b2e03dc0091d5cb62b7466d252c5c0e4a39e1b266",
+ "public/assets/MapPage-MEfcwtYj.js": "bcceda5970102ee5e1402fef2fa4e4c7b95b7e9e713cdab1be1169d1c778cbc4",
+ "public/assets/MapPage-V-HR1n5s.js": "2f1495c1b9965707392aa18b5f29d8e8e31679c1a5ea44acc711812ee2edb689",
+ "public/assets/MapPage-bENFa5lt.js": "feb4e79151ae8f33ce45a587ec27f4b378faf84475bcaa0a1921859def670cbd",
+ "public/assets/MessagesPage--b4Wkkmz.css": "f7570ba32576861d4451c7258b68b2b3a6c61f3d0d20b3f2d31e608e11700337",
+ "public/assets/MessagesPage-B61ii4Fu.js": "496cd8b3c5d389764a3e7190adeb3535ab10406a6eae0614b4950d1c9c95a65b",
+ "public/assets/MessagesPage-BF2U2VwR.css": "cf00bca52630bbfc7778444cc22718191f4e88716db7d88f0b93bb543ee2ca1f",
+ "public/assets/MessagesPage-BVpsGmWC.js": "4095c4084da602868c0940bd85327d92178d6cfdfaa8e5bd4aaf3439782be3f1",
+ "public/assets/MessagesPage-C88C1Xta.css": "148fd8eec5e7599cc138f4351df7a92046ce0d6798f725d5258869683d63dc5e",
+ "public/assets/MessagesPage-CAEN_2MV.js": "1f59035de93b2f8655a58196fcc4f98477ea20b443d83dc2f099890c1580c7f2",
+ "public/assets/MessagesPage-CNFsm2Fh.js": "2e24f98ef452bb49c086431a6fdda90691ef76fe4ad69bb7b1c1a1dd6f0bf7d4",
+ "public/assets/MessagesPage-CQNx2QWQ.js": "6ed122ce71e914b539bb3dad4834ced5163e5b9711db6c7be9eb859bf9c09dc0",
+ "public/assets/MessagesPage-CRDsD-DT.js": "bf646c9a91a7a1a832fd31ebc1c33ad38bd28c761489b3f14f9215cc343cb447",
+ "public/assets/MessagesPage-CUmqFQTq.js": "a769783cea4371cc89dd49243dfd4bd9cc460f10c36f7366c93d82fd22f88843",
+ "public/assets/MessagesPage-CxK5eF6i.js": "a9564996fefcbe6cfd7141f561e19bb6a92c47b29a3dd34ed9d61cae478f98b5",
+ "public/assets/MessagesPage-D7cLbQ9T.js": "b5ccdb25280135468a730292797fe4ddd7f6e28d22dfc2997c9ec38d974832d8",
+ "public/assets/MessagesPage-DL8Ws2UA.js": "7c0e33cfb316078145a42028ce94922d2626cc800484e5817a2c0d3f236524a0",
+ "public/assets/MessagesPage-Dh3eLASI.css": "570321b3601218331b24078f06c7b40cb7e2e739afd8111bbffd4606aa0b4e04",
+ "public/assets/MessagesPage-DhZT4s8A.js": "ced00fde1a1401059fe352e4a3bf411c9afd77b474da4ad89d21f724ccd31a71",
+ "public/assets/MessagesPage-DpjT4gW_.js": "ab47d8b2e4908f30fa123b1e67276705e6d62289a3522df8e6fc5a76b336eaa3",
+ "public/assets/MessagesPage-Dqh-J0Od.js": "ab22c9f13eb0d5876e01d68ec0f45204884cbf4ffd272ff87905004c48451e9c",
+ "public/assets/MessagesPage-Du-48GAP.js": "79e0f9f3d430554ce42b234970f606f23dae34951f385c2a9356507a9928f156",
+ "public/assets/MessagesPage-DvFnDOIP.css": "5787045f5c79d86259fde1fe5c8b3fb5e39ec73c7ae819817426309831919ab7",
+ "public/assets/MessagesPage-Hu-e3LT8.js": "08b878369365367dfc2268d18d7301477e9b3dab4eb8dc0955ce84ce41d2c0e9",
+ "public/assets/MessagesPage-NF3gl6RX.js": "36880373b540cb128d1711302d94071a8bbeb7a771bad705a23ede89cc3c9e50",
+ "public/assets/MessagesPage-bEGvW-60.js": "cadc06961d54d4c25b54193fa2b458f4b085cb1f6b977d230590459b81f09c29",
+ "public/assets/MessagesPage-jKakSR6S.js": "0ff478841e8836f0a25e7dc735d3a70993cbd236c599a0995bfc56b06ca12779",
+ "public/assets/MessagesPage-oFRIoqSr.js": "0aba7d2d1c6c9ad26ebcf2790c099da6ca84e50b9a1b8e633411a70f645a9bed",
+ "public/assets/MessagesPage-pwpd76Ze.js": "fa1a2b018ed960752a3e2d194a10e57df5b169a3904111c7f108ad95b315a5b2",
+ "public/assets/MicronEditorPage--WEqT3jg.js": "bedba40e087a5784a1098d6b7aae29c0a5a8463909cc88f813f900a654b2af7b",
+ "public/assets/MicronEditorPage-9474FCyd.js": "0f5b634bd5025c9aadefd61968cda8d7b2931114571f879b4a9045a8268a1896",
+ "public/assets/MicronEditorPage-976EAUIE.js": "e4e3f9fcdfc251a0a120f223651c84192c565d3ca83ba53b304952f9c945b1f1",
+ "public/assets/MicronEditorPage-BBK1A7cJ.js": "7c836c05853341cde4fecfd845e241f2e93627212a88592bf059eda1f4121698",
+ "public/assets/MicronEditorPage-BCfmF0Wu.js": "0d999ec2b7df643461725ef07ecfacf3956ee00d6eaddf71038735f3601aeaef",
+ "public/assets/MicronEditorPage-BDnlIDRb.js": "9fb055f8d44e813c000203d0f70e6479028619341a40a29bf97af001e0f8e70a",
+ "public/assets/MicronEditorPage-BEdSGsGl.js": "73f89cc0c3ac2afc2a349b70b10328d3dc3f978a057806ef6facafb1e2ca6062",
+ "public/assets/MicronEditorPage-BH3qvvuF.js": "d08db84c0e551de6932170d4e61f47eac2dee80cf8a426f6528ae3835f8cd0c1",
+ "public/assets/MicronEditorPage-BPN_tKAj.js": "c9de06c8c5fa69545d090cf4735cc36789580cf653ea4c157ffe6717f71de649",
+ "public/assets/MicronEditorPage-BljohsXU.js": "08e17145a05c7487d8d27df6aa4f44b0a51d4511c02a7cda84a39b2e4ea0b789",
+ "public/assets/MicronEditorPage-Bp0OQGCk.js": "0f5f283ea6649fcb729e97b2098a9086b9bb653a895e742ebaa26decae65ecf6",
+ "public/assets/MicronEditorPage-CdnSK4Uo.js": "a010f2c15924f8aef47907dbdf81217ae3a0fa6915cc9996f63d009b4a1d55bf",
+ "public/assets/MicronEditorPage-Ct9TtKxc.js": "31cfd93234267adbb1c5f58995f767cbb449a3145a2b45925bfc3d1b78a58171",
+ "public/assets/MicronEditorPage-DD85pikX.js": "1a35027d1104d65940feb305d34e32c86a43f8be6cab8a90217629efc7db4682",
+ "public/assets/MicronEditorPage-DIIopU7C.css": "0be40b9c9ab8f83f00ec13cf9fc10e64919159ff7216c4372a51d56846894c09",
+ "public/assets/MicronEditorPage-DRot3z-g.js": "867c7187a1e4f0dd77f5e891cc2187b977d0dd5d217dfcf3702bdf2157f42585",
+ "public/assets/MicronEditorPage-DTspJuUx.js": "2e75831a4a7baedee6bdc62c8d23460a2da4d5d680a566f397a5bf843675bc7c",
+ "public/assets/MicronEditorPage-Dky2E00O.js": "dd81f19e9c6b24f2281bcee3b6dda33271739d7e9dded6963c8d5134bbbc3266",
+ "public/assets/MicronEditorPage-DwnzZIiG.js": "d04289bf13209dc38bf468b251574367539c343409863b3a5a7c0ad6a6c0035a",
+ "public/assets/MicronEditorPage-WPZtDcMa.js": "cecab947536885253b085a126417bfff9005a2c860891900c389a225a30d2a3a",
+ "public/assets/MicronEditorPage-r4qbXEV_.js": "bf6a408d57acb7bc2b7dd870268c5626ef7a612913c96d39a6ddc2559d7b00ac",
+ "public/assets/NetworkVisualiserPage--VwAGE17.js": "912200e3d8e05aa651d0923f954f865a821e9725feaed761c0b4d3b7d671fb7e",
+ "public/assets/NetworkVisualiserPage-6HbZhKrv.js": "995e639984fb1e476fb0cac9958961a13bad35b5c78bd93d9007150308bd44dd",
+ "public/assets/NetworkVisualiserPage-8ldrPBdg.js": "3aa7dc00f60dfe7da6d8b89f19ac2782e5da1a50cad76f85a12626437629a08a",
+ "public/assets/NetworkVisualiserPage-BDZxaSEp.js": "cce59294587c2a9ec808d3e1b987d77b4894ad1d560e126602f4a7ab1165831f",
+ "public/assets/NetworkVisualiserPage-BloCX2-J.js": "7f740fb0be6d44d87007ee53deced22e59c97a362f8855cbc8920f24c81fce46",
+ "public/assets/NetworkVisualiserPage-BtNojdhI.js": "a7d40d0e0f9ab1a9ea61fe29b71332dc84e9e57cde7e088ca2b31e5cc750e6e5",
+ "public/assets/NetworkVisualiserPage-BvE1g6F7.js": "259df4f4b3142f5d0ea8118ed921028ea191e9995425edcb21f8bd8f4bcf7c6d",
+ "public/assets/NetworkVisualiserPage-BvtorWAa.js": "87979f662e9e4b1cd7446bc7d52a7a2d4a9c2a21f0663fa44490ca400ee68298",
+ "public/assets/NetworkVisualiserPage-C8FN5v1Q.js": "dd52a894134bc261d28daecc1e81bf63dfd282fa52aa91c6cc900c57c9802915",
+ "public/assets/NetworkVisualiserPage-CBTVsRc-.js": "feb5e5b7ec33c934a6ca1f24e089e7c449a061597a749762dfefef35e06397e7",
+ "public/assets/NetworkVisualiserPage-CN0_L7zc.js": "6aa642211adfc6541a0fda2000e69f3a0fcbf3d3d24d19b5387fe86588841185",
+ "public/assets/NetworkVisualiserPage-Cr4wxUcz.js": "ff9258c107ca71d8e730affff883ad765b35584f532770dd467790f163dae33d",
+ "public/assets/NetworkVisualiserPage-Dn4VoH5z.css": "7d0a1e2356c59fba617e055c685a2eb25fbbb7b720cf631afc7a11b1bba34eea",
+ "public/assets/NetworkVisualiserPage-DscY03Q-.js": "e6c70fef298e1ebd676a7f834ba1072fe436fea1a4b5e0c276fb735dc7e8697e",
+ "public/assets/NetworkVisualiserPage-DtS-D5Hu.js": "b4e64c4d47b3dd0afa2c6a7bcf67bc8a0587f0c95c05922f645034aa9bb05eb9",
+ "public/assets/NetworkVisualiserPage-LIs4u1pt.js": "7d7e553f04575225659d6ceaa018ac999808d9f6ea7e60abd5c456533c37db2a",
+ "public/assets/NetworkVisualiserPage-Z9_V0oWs.js": "fd14a74bc258d981747923b12c77eb2d34f7063e87c9d2c0979f3f2d78750f56",
+ "public/assets/NetworkVisualiserPage-ZF3d6qt6.js": "3417e5e80b6eaad815bbaede43bd7aa674b7f7c94a698c5145d9bc185e2ddd37",
+ "public/assets/NetworkVisualiserPage-bODOn8Sk.js": "410d83434602664b68c62e5795509d9c814b2dc2e1a8d6fc68bd3380adcd8c4b",
+ "public/assets/NetworkVisualiserPage-m92CsmaM.js": "2718c0c31bcb5551ea1be5901e3952b2a26d0ec90eac4a3ea15acdf5952b6995",
+ "public/assets/NetworkVisualiserPage-veyxCtSv.js": "ac2fb50a11f9ffd94467f29c83d93e2cb7e866686324aeefecba60f5497123d0",
+ "public/assets/NomadNetworkPage--nZVf6wV.js": "6da1a86a34cf1e7b6c0bb0937d126ca48a7723b19d13bbfbfd8869983cbbc22d",
+ "public/assets/NomadNetworkPage-BEqPSuu8.js": "bfea82c51f2e9ca1c78e8825f9652e7d495d7feec707be97cf9377165b5e8f4d",
+ "public/assets/NomadNetworkPage-BYwb_6pU.js": "695d3cc1b51e9b0b2c29fd09d7a900d8513b8030dd2f3b84d20745fb377fd8a8",
+ "public/assets/NomadNetworkPage-BfZmUe0y.js": "d6aa4fc064f83f595929497cde4ae7fddb3f1bf7f222f5075c36dbb718bb3654",
+ "public/assets/NomadNetworkPage-Bo8owhTU.css": "1f5299f7bac61900cbfaeaaabfd6256df60aa7be98986301a6e3e52b84ba6998",
+ "public/assets/NomadNetworkPage-CUUy1oU2.js": "e280cc7e6ad16735c69734cca855902a6d27619e55fd029cfc7995a9f638a88b",
+ "public/assets/NomadNetworkPage-CWAnzZ1T.js": "4a8a368800a8b4b392a7bbc96fbbe25fb8169c0376dd6da637ad02c4278bb23d",
+ "public/assets/NomadNetworkPage-CYSpqOgP.js": "62a3398b493b3ced17ed1e5c43c3a0f461cd6aedd6472ce62c49717e59c10887",
+ "public/assets/NomadNetworkPage-CamExDiU.js": "11045fbc6450f3964b31cf3672717b97ec758903b76898d14606a5e97cd5aa0c",
+ "public/assets/NomadNetworkPage-CodVPnoU.js": "22cced8c83fd77a6fb07bdc64d6683866e07b10e7f0c8af441a5e2f35245e10d",
+ "public/assets/NomadNetworkPage-DFZNgTOH.js": "9c33dbe7d486dbc69b5f648b546a7adc20a6b4bb891dd3d005329475cae02dc3",
+ "public/assets/NomadNetworkPage-DMPAhzup.js": "bac6cbee021c9a6abe918d136320d47c2b7045cbd74f09cb4d05103dab3d8129",
+ "public/assets/NomadNetworkPage-DVhS4FAr.js": "e4c02cb86ef491ed688544cc1c5ff8e555d4be7c318000edb51441d46df46abb",
+ "public/assets/NomadNetworkPage-DcVc1rHg.js": "5fdeba15fdbf851e105db4ccea70cee8ba82691eb31015c0a00a763a3f9a19e6",
+ "public/assets/NomadNetworkPage-DnB6nLtl.js": "186869fa630e44007212160f4f39af1a4e7f865ca51ea1f75a2eb943d2dd2143",
+ "public/assets/NomadNetworkPage-DsSzKmA1.js": "efc383c8fb6ed7690388c4ba242790e94461a9cb8c4ca4a9c64478338fd65044",
+ "public/assets/NomadNetworkPage-Lmz1epzk.js": "6751a0618c9e70f96555627c2d99a1de182a5f64a3d1a8cfa5bb48a23e41118c",
+ "public/assets/NomadNetworkPage-MSgWwiBK.js": "f27cd7706a29f5ce8a8f24bcaa95b7be2d250ecb09dbda1dd8ed97ac07f3e73f",
+ "public/assets/NomadNetworkPage-QTjm-B6C.js": "cdbf955e3a5742a5891b0fcb32ca900eff8fdcfdc8cdcc10628dc45a459890c8",
+ "public/assets/NomadNetworkPage-VPo-EVAj.js": "f2d82299408062ef154613716b3bb3c48a09d2d2918e6ba2ea1c72e2c8c31086",
+ "public/assets/NomadNetworkPage-tfP4kQ4u.js": "648ebcff2daa09aa170c266c689d2c9d172441ae89ba558b93d51b4c3812089f",
+ "public/assets/PaperMessagePage-BNCpEUaL.js": "37e7da26ed299d23062c931c33b995451bfc28809bbdbb8461da05e628944a08",
+ "public/assets/PaperMessagePage-BaF3Ut5B.js": "b28563c579d55ad363e115f4786ae9a24fd572fabe076a71af790ca5709d37aa",
+ "public/assets/PaperMessagePage-BrAvwrKv.js": "cc9b8c171ed0a44a11e45c99d980a408a923afe7836388da60eec03b8125fa44",
+ "public/assets/PaperMessagePage-C9k9SS0q.js": "6fb204be6abe32835eb3b590b6112f172c527c47776cdaad60c03e08e5c1e562",
+ "public/assets/PaperMessagePage-CC8g-I04.js": "d8d4dddb5565ef0ccf868c5dc4fe64d78431a72203a0ff6fa43fa39a8cb0b036",
+ "public/assets/PaperMessagePage-CE9vlmu4.js": "703ed77290fd3310cba4f3edfc8a11ec6600823ee0c358e38122ea6bf7c055c0",
+ "public/assets/PaperMessagePage-CPzgyW2-.js": "059d204d8231a79330b020d3d16d1c56ef8592a230a0e5daad17ba22ee4f4d88",
+ "public/assets/PaperMessagePage-CR1V2V1Q.js": "d696929efe4bbf5f429bcd81496c976205c7c3f825ece4a0b8cf989a16de4454",
+ "public/assets/PaperMessagePage-CR2WQUUT.js": "cbea36eed1fae62c181af7125fedfebcdabcaf67d4a1eae2f4b399e6ff233198",
+ "public/assets/PaperMessagePage-CwTlYRnA.js": "6f1a74dd40d2c2e554dd6ed398b63049780afb905d71259613de8732b44e6d32",
+ "public/assets/PaperMessagePage-CxO-Nb-0.js": "1cbdc4089c95abd1bb1262f7c5b3479968ca1d515e87bae541cd2aa8d90ab6fc",
+ "public/assets/PaperMessagePage-D3Cx3Pe6.js": "8d032d4ee0f767899b1976e017dace4dcfc9c6141ed70d06b3a0d822dab205f3",
+ "public/assets/PaperMessagePage-DC0KnRM0.js": "da6c5b1cb130119fdbc72e1276256f5388d97c48ef3351be403018b2801f5468",
+ "public/assets/PaperMessagePage-DGV26OvG.js": "6ff07c8dc9a5f67a864a9582b372fdddc29aac387143fa3a204cd5f8af77c7b9",
+ "public/assets/PaperMessagePage-DUbO946r.js": "2e7ef1df4126acfcde0a3aa55e90ae840a170054e9c481d632df1020a1078fc4",
+ "public/assets/PaperMessagePage-DWEk-OOr.js": "e1732d589989226b7fe67ad22cf6b538f5e582e9a7a163c21fd014f86b7675a1",
+ "public/assets/PaperMessagePage-DsjRDU4I.js": "010eccb77a7163b29ef8453231c2c76c7b2dd0bb48a637872fcef95c98033631",
+ "public/assets/PaperMessagePage-DsypBSmg.js": "30267a6d3b2aebfdb60cf840665c9189015b3d108478ec1a5200bf224cfe1478",
+ "public/assets/PaperMessagePage-iD5rlYTd.js": "d23ae2b554b231ecdc7ee34e0cfc23a92a2837ed2387cb33ba285dc2c0d10a51",
+ "public/assets/PaperMessagePage-mJGpcVHl.css": "bf27a06adc2d396d3bc30145ad14051877a21ada4435ca8115283bba69e7db60",
+ "public/assets/PaperMessagePage-wWLADHMp.js": "44cb324770e919fbc456a9ca3684eb6cb9fcabda4cd654a60182b18281af63d2",
+ "public/assets/PingPage-605oZnat.js": "cae3acbfeb55381902726b96bdf364dba3b89aa7267facb73d0449c12376cca7",
+ "public/assets/PingPage-8DCvEeij.js": "e897d5276b2b301b090b43575e583d511e7fcc00386b6aefa27328919d0b7451",
+ "public/assets/PingPage-B1nA7XCv.js": "0a467a82e0a785ea53151dd6b898461c5408b8072935b9f0074aa367f12e5d8f",
+ "public/assets/PingPage-BNNtwpel.js": "4ac6d361cb8abb2ba5556f0f00b9717331db905846c46a4b521544daec515e99",
+ "public/assets/PingPage-Be1jI5Ws.js": "c70fb31837f876b55d53dad392c039413150e704d7a701ba7aeaedbb0c5166bb",
+ "public/assets/PingPage-C7D9ck95.js": "522a2dfb346b45773495bd8c672bae359d6e2486e8fb03170e79718486d65951",
+ "public/assets/PingPage-CA_r1-ZQ.js": "b5044ffd384aa56366e0bc67880d0961eedc686a75bef0ae7ec8c727a61faf93",
+ "public/assets/PingPage-CBeqTAu8.js": "d9d5e70f41909e28a730022a599af6f00c8ffc077785909458ba9e94323a03f7",
+ "public/assets/PingPage-CYN3BZxh.js": "ec69a104a389bf8b99e05deada955bb8b768d52c8e1b641f26053c281e7cddcb",
+ "public/assets/PingPage-CpQX1R42.js": "00719d5d9932cc8b56d071eb5263098dee39c44e07ae73e88a510691507367d7",
+ "public/assets/PingPage-CpVPR4vQ.js": "c3343fc90293c7884b2fc97248c2df7730d3424542ed995733480f1eb1a3b6aa",
+ "public/assets/PingPage-CvqXFI9h.js": "9dff7fca0683fb0c11a962d050536c9e367577e97833bd75901ef5b57fca746d",
+ "public/assets/PingPage-DFZmoCHH.js": "9438d54dee0bac8361b2addcc66c749ba5f9be81da06015663f3bf4ebe11580e",
+ "public/assets/PingPage-DP51KWFg.js": "a7102d863bb393007c655cd34e7d4f3131367d1303ec2bcb3202ab355bf7fb35",
+ "public/assets/PingPage-Dxnwuj7k.js": "2e4e5577fc06745d21f293035a41fb71e37ebbbf30cb11c93738af37e9d48434",
+ "public/assets/PingPage-GbQtaXL7.js": "3c18baf3a849db5d8293d54cee7159fe2a8d853cf4865827e90aa067a6ee730e",
+ "public/assets/PingPage-U4P81pR7.js": "652a19ef53a979842e38ee1910b196cb09a6655e16ba1b653b792bd798c39674",
+ "public/assets/PingPage-jV34_kWA.js": "3f1971ea08110ecbe8aafd5d2391cbd774315048c13381626fc12ab6a901946d",
+ "public/assets/PingPage-q8ykEogI.js": "2b8044568df6f10ac934b45944e17479b16b74fefa58ea1ea96c64e118519462",
+ "public/assets/PingPage-wGol-jpK.js": "80a2d4b926ad5ce5810dc9c23de5ce547cef8b33e2fe688003170fa8d9446857",
+ "public/assets/ProfileIconPage-BD8um3u5.js": "d8539b579d44bf5241e0bd3a0de2e112d4ec22c76139222ff67cdaa626f00873",
+ "public/assets/ProfileIconPage-BODy1ADP.js": "98e3006064df0e54dbc8b82e94ad7f2afc29ac3529114d6930358719cc243980",
+ "public/assets/ProfileIconPage-BWQJwqVh.js": "e9733ff0cfbdd95b46ff8bec57a20603a2b2a4cab080e0eb13b988c9121d8bce",
+ "public/assets/ProfileIconPage-BkGnbcAy.js": "26d75d8beae39d0efbff4f4274eb592d0cd8708f6940e4eac2f54d308694dda4",
+ "public/assets/ProfileIconPage-BtfXSHS1.js": "e42d424139f7177ea67e9cdc6c6d17022e8366a1a2ea919924faee97a2a13a22",
+ "public/assets/ProfileIconPage-BuLRxDLh.js": "4ab27a738d6c86b6570a92efae3aa95b62d05ff19c63db04a12ddee55136ae67",
+ "public/assets/ProfileIconPage-BwLzG_fH.js": "93d54bfa9a1bd718fa4cac24b54944ad678158ffaf57a941f773297e1dd67dc0",
+ "public/assets/ProfileIconPage-CE-MQVgM.js": "418e440cec8d731f57f638ca4a4c7e104dbe1a655bec6e87569f67f81cfc3a65",
+ "public/assets/ProfileIconPage-CGj4CTqa.js": "e4294feca7cb8edb9c6ce2ecf776538efe62ab8ada4145c382637251e38892e0",
+ "public/assets/ProfileIconPage-ClZ6J3JQ.js": "4b5dd8253e715db5650144ac9097a9a45afadb2cc06a538a39766dd3ce6beb83",
+ "public/assets/ProfileIconPage-CpEQ7Yyg.js": "9dceb67d757e79c807d5f1dbf1849f478b9eadee21eaea9dfa92be2e8c123dd1",
+ "public/assets/ProfileIconPage-CzfhEjEM.js": "ed580980d6d4d365d98f467e56a44e884e437d1ab006ddf38dfcaa32678c92cb",
+ "public/assets/ProfileIconPage-D-tHvyk5.js": "353890704a641df34db34882ca061db9a76cfc2ed69b80f2a31207798c5fdba0",
+ "public/assets/ProfileIconPage-DDfbIMis.js": "c3a8d462fe4fc6f1756c5257baa8252ebf5b824366749da14f14e3354212e9a6",
+ "public/assets/ProfileIconPage-DcqQYExK.js": "005bed1af7252eb57c1bdcd6afd591fba77f126a42197c6f201be00832433b82",
+ "public/assets/ProfileIconPage-Dq31ODIj.js": "cb0928b38f7d94391c96d8110c966ab49345aa882cb133aba6bcf849dee9d427",
+ "public/assets/ProfileIconPage-DtLNk3ld.js": "53706e3c730a11cc0157da441fb35890f050c28092f4e787a750ac4075c0b8e0",
+ "public/assets/ProfileIconPage-Nafv9Djw.js": "6ffa92b0a3549b66ace1ed267184daccf439e2c827335b869b39620bc88881aa",
+ "public/assets/ProfileIconPage-e3G5YCSe.js": "9bf5f5ffdf1fa88cac8b054eef6907a700a70dfd0fe3495559d0461e82c34f2b",
+ "public/assets/ProfileIconPage-lXDI5s8D.js": "f68d3d8adf327846a4d1644d967a2389e37d4f7aaba49f10aa5e5ad1288ef938",
+ "public/assets/PropagationNodesPage-BcSeS9Oh.js": "6c2cbe7ae57620f030b04cb755054d791419e6b11b1282473d836949f6b4ed29",
+ "public/assets/PropagationNodesPage-BpDBsaK9.js": "1c3bcfe5b31344ca6769192c9f8ba5cb275d2a36337a19af39a45f1646d687d2",
+ "public/assets/PropagationNodesPage-Bs5QHHR4.js": "fb7dbf624aa0c5808dc32194044a30aebbe55a5773410b164b34819d0b523ed6",
+ "public/assets/PropagationNodesPage-C29jypnG.js": "1a402cfe6ac25cfcc28d3bd7604ce7af5650f42dacabc9043a04f146f0fdf3fb",
+ "public/assets/PropagationNodesPage-CFB490RL.js": "b14819a49885b54e9a290581521362552289221c38f1971fcbbb1c1cc0dbe1d2",
+ "public/assets/PropagationNodesPage-CfkUQJzn.js": "46f2690d94afce7b9a26898ed22e736a82beb924f9d89d83555f0ad4adbbfb62",
+ "public/assets/PropagationNodesPage-CrySA9JB.js": "950545402f7f96e64670228dee6756e2810cbf063d739eedc2a946a3030beaab",
+ "public/assets/PropagationNodesPage-D-VHRWQh.js": "b822e5b3e57e790d21c2f50bd0d60f2ecf13c0d5a08a88da6b6103bf7250c4df",
+ "public/assets/PropagationNodesPage-D1EJyBZo.js": "f212cd93629abb4c1f2dcb121ba22473c792969d3072d039a9f79511efe457d8",
+ "public/assets/PropagationNodesPage-D41vW7jg.js": "c301a492a8ce193a55593b9a593d6babb4e1185909055e1057e83e555bb0ab4e",
+ "public/assets/PropagationNodesPage-DgRJ3NNC.js": "18d710653e439d2be54e883a24284e616edd48279b8162b6d4d5a04a47c97482",
+ "public/assets/PropagationNodesPage-DjvSg0ye.js": "df2b4f23c70912ba06a0d6dd969a7e8c6408c9d1e9e263dc521b6572b863f7b3",
+ "public/assets/PropagationNodesPage-DmXJ1PHO.js": "aa7273a38e9d64ef28bd0401e6e142147dbf8074d20ad288846855bd087b10c0",
+ "public/assets/PropagationNodesPage-Dzh9c-1R.js": "044407b1accfc35c00a98096cb390ff01c4f3f6e705e47e9623113c0d2480ff7",
+ "public/assets/PropagationNodesPage-PivWmPbY.js": "29b8070e2f1c4c74bd5cb9ba908a8fce6b220d98f28c7de161f0ac140b84fda1",
+ "public/assets/PropagationNodesPage-QdoqH-DF.js": "b2841eab2f4ba9015647ad52320fb9db007fbb21bf870f5b00adfc6d852e5598",
+ "public/assets/PropagationNodesPage-aJ6q5dH_.js": "3a5ad9e493aeb28148fec23ecbb96126dc38ecb3a3491c1d60a24388342bddae",
+ "public/assets/PropagationNodesPage-dBBjMlwj.js": "d5ddd0e826409f2c500918bf14fc43483a606488c48e3bf12aa3ef7f7c3dc96e",
+ "public/assets/PropagationNodesPage-uqS_uhdD.js": "c7562fc2d49282b1ac3f65979921775cea32851ff4d208eaf73b0d438b144dc9",
+ "public/assets/PropagationNodesPage-wZWgAX0h.js": "a7d6ec9e4562e2e09226bf34552164433a715133494d00d03d5a81bd008c250c",
+ "public/assets/RNCPPage-B4w8obKN.js": "d84eb4b02e52c7efbd4ec9fef1e438a4d04e320fe00c408e25c8f7d582a6a7a9",
+ "public/assets/RNCPPage-BNHm9MT4.js": "aa6d05aa788088669cb42a184572a1e657e2fd3752c46cc0fd9d56d41dfab2a1",
+ "public/assets/RNCPPage-BZmPFdcq.js": "e40f5ceeb86d56eec72029be77a0303ac69ef70ad22bda2721516efe5458860f",
+ "public/assets/RNCPPage-BtJWBJUf.js": "320592191ec00d0aa225a6f055750272e22c0711cfe013476ed5bf2849adec54",
+ "public/assets/RNCPPage-C51Rhf4B.js": "ce3a3d8115d808737e25d75b853f1c99a294b239a37efa1697f8af3027617bf1",
+ "public/assets/RNCPPage-CLVdPZCs.js": "ea9408eb8b1f709bff1001288975f1b939c495f17bcf72488497fc77948434db",
+ "public/assets/RNCPPage-CWuifO8N.js": "5ce0e2cfdb777e61ce9f2741952597576c8a6ba5373dde50e4c09aa3ad146169",
+ "public/assets/RNCPPage-Cd-_YgyM.js": "945b90df6d16e164ff5a411df9718ca7864276d9da5f74f0f60a57667919be5c",
+ "public/assets/RNCPPage-CrlLp6sn.js": "14f68628e9aa2a669cede34bebf7b5ca41141d5fffd44d9af298695f6783c5a3",
+ "public/assets/RNCPPage-DI7MX88L.js": "6638e5b1847e9c4e6ef6e1ceec14aed7576da2a68ae4e8bc5720c14e21bf99ad",
+ "public/assets/RNCPPage-DLCuqLGc.js": "394b53b1d265847926b5ae568991780e1ef2b90cd69cd7afd8ea5caf5af6b55e",
+ "public/assets/RNCPPage-DLRqUp5O.js": "284c7222030f948aafc5e3f28a0713acf124ce9433bebeef9086c92cfce1e84d",
+ "public/assets/RNCPPage-DScEWctG.js": "4eda3b5fe8e143cfae990e276e1000aff19e03fc6af2641e23767381c59386f6",
+ "public/assets/RNCPPage-DjZnwIhz.js": "833cd918a561932fb6ab58094e2420ccba8afacbef727b947ab10fc0ef0eef9d",
+ "public/assets/RNCPPage-DkRYbHe0.js": "8dc9862ad7f7a77ac7e523e559b517298c734dd061065b5ad225699b7e28b917",
+ "public/assets/RNCPPage-DmJzoask.js": "6e8fbdb27c643ba75c2e2d0a35c3061ad5faede25dba0cb430c2ec0b48c93ba2",
+ "public/assets/RNCPPage-IAjOvgS3.js": "34475e562c053b1aeeb51ddc7bc17e187b0bac4f8e244f1de716a4de6d27f992",
+ "public/assets/RNCPPage-Vazu-YB1.js": "90628311410d963b3db4c3887d692e7b281c1f15340426853a9b09698f468132",
+ "public/assets/RNCPPage-c0FDPWtf.js": "e19b0d7804856c5257b53f1e6298651e928b0ad8790600c1b602c5a3530174d4",
+ "public/assets/RNCPPage-n6SAd7z8.js": "11a6ddb12363253ac02cde23b12c6c350899ca1a11a457949c5a3d713420d0d0",
+ "public/assets/RNProbePage-B4l8yxQP.js": "d608a7f434672ab7dd29793610b58085a9ef0117757175e70f3d9ee95d02d0f6",
+ "public/assets/RNProbePage-BIk8vXT2.js": "fcf82ca4dc1afa8f3b418a030bf3d6988fce9c515eddd789536fff8b1f750eaf",
+ "public/assets/RNProbePage-BKIWaXrV.js": "5e96a825ac3b3432874384ae49c0d7d5511ead8ff92d9754da0e2ee04b225834",
+ "public/assets/RNProbePage-BPocFDc_.js": "7bb8c8ce6c168b539c11fab16583d4efd98c4584fb212091806789d56cd3bb8a",
+ "public/assets/RNProbePage-BhmRwqjI.js": "339030561bbe2ff01e8e965e53e4b527251d9cbcc1722f35714180345d3dd0bc",
+ "public/assets/RNProbePage-BidNyS1i.js": "a2e0f2ea394cf1a5030caebd4590e936a97f5aec0e7d5ca109c850f6a50f2e39",
+ "public/assets/RNProbePage-BjKRvght.js": "f100b868ad40c2a64a29aa99fcb0c5abaabf0ac551dd538ed1abe87d59b5d02d",
+ "public/assets/RNProbePage-BvM_mqle.js": "34cc1ab6077855ddff0d69b7f8bac4eb574ff67e7a590f0e4935c0ae416dfe19",
+ "public/assets/RNProbePage-BzdcUd_3.js": "dd27703b77dd21ddac38bde4ca6edf4ab53346ce1b819e425fefe52f766086a5",
+ "public/assets/RNProbePage-C4UerEa8.js": "a11dee743d699b68332088931b4059028e71e0f134ad830b121bc846c579511d",
+ "public/assets/RNProbePage-CKfF2j6U.js": "a1ac77ecb045cef88a123c49a2e9d51df562a674d02ad58b11d184a6480fe457",
+ "public/assets/RNProbePage-D3ABqDbl.js": "881a386c7f66bbd0a52bcd1c87318341cc3d9a2bfa8005b46f535cae684f8899",
+ "public/assets/RNProbePage-DBadiIiD.js": "f304272b3e6dd6bc1510f7132f3b29b437ce5dd6c4ec844f41dba80007a66c6e",
+ "public/assets/RNProbePage-DaNPh4kV.js": "5d77863939deaceeb5672d82fed43698166bcd3b2dea06e09da6ed89d6b537d5",
+ "public/assets/RNProbePage-DdT2pR73.js": "703d83f7334f2d973c3a1107463de732e626aa7541d97d70580cfbf2606fb5bf",
+ "public/assets/RNProbePage-DpJgKra4.js": "5667f806e57c3eb3bdcb3d7ccf9c9d53200968c6438728b14628be191d1251a3",
+ "public/assets/RNProbePage-JTwuc4jR.js": "6eae7a3bc772c335e647bb886fa88e091c48c38e396a98d0a7a1de8167e4a52c",
+ "public/assets/RNProbePage-f3FJuUps.js": "24f588621a7ba733067e0cab9f87031b8de144e3d9f707c21eb7002dadaba4e7",
+ "public/assets/RNProbePage-hYBvGAJW.js": "c77416dadba9c37c0fa96b07099fc649693d0fdb29439e0a4c1672e139b0277d",
+ "public/assets/RNProbePage-pZHdmx6n.js": "de5b8e59636c2bb4e16c968c78c85354b4ad2444a32b4ea9ec52f11757e1d94e",
+ "public/assets/RNStatusPage-BEByD0uG.js": "8b9b4eab8e483c3ff9ee5f0268b5f61a847ee82c616284b5d6e8c44a0c2adfe0",
+ "public/assets/RNStatusPage-BLUgxsr9.js": "181956b34a29f769f3e3c4a593f3ad83c1767a1a024773d51279d4d5f3205f0c",
+ "public/assets/RNStatusPage-BMKr50iV.js": "e6493c806b2066cc915c2b3dc077b398f2393d2aaeeb3f3e02647a65e2905b3e",
+ "public/assets/RNStatusPage-BceiBbcN.js": "3b12a91d98cb48e82f02e7544aef46073cbee13d8b2ff081c41c7ac64648b6de",
+ "public/assets/RNStatusPage-BdHwTC35.js": "72a4808601d35076078be711d988459d3202d560d1149844b6548d2242f3da35",
+ "public/assets/RNStatusPage-BdytMz1p.js": "7c064e4a2ddba253abe1b83d34783392625e6232ffa077eeb1b656c1be5bd59c",
+ "public/assets/RNStatusPage-BrGcmhTG.js": "d2414c00cfed6d4c4280d95792765b1d75d7d09f84392c3dea3fea78ab5bbede",
+ "public/assets/RNStatusPage-Bt4n9T2V.js": "0e65f9f5ed8f93b68b76d36831cf9f1e0d847c9e31272fecaa76da1578fd29a7",
+ "public/assets/RNStatusPage-Bxsv2zmp.js": "838a611d479b56733ad854c2246db5987d2a0d0924bfdce41602b4af9cd0ed9f",
+ "public/assets/RNStatusPage-BzMMLgMU.js": "09d3397a3a86ca943a4391ce9c536789eac066ed17db29497d23e7b2cbc0c62d",
+ "public/assets/RNStatusPage-C8bB1KWP.js": "a2d07ffdbab07d003ca7ae310012cd2c2a463e4aa4ac45b3647c77e647403096",
+ "public/assets/RNStatusPage-CW332LiS.js": "b79932f83bafd4cd80977cd546926919e5194e709e93ae05c192cc59e77b8594",
+ "public/assets/RNStatusPage-CWOe58fZ.js": "3b36994a5b6e887c1f1fed3361414aa5f9987b758716fd3c0f69e51bc0973dce",
+ "public/assets/RNStatusPage-CYMG2EzP.js": "8c0f303cc1673da4c4da3de9f36cc1e5e713543fdd9a379aa39be5ef1c157aa0",
+ "public/assets/RNStatusPage-DHVEJlF1.js": "062867d170eee11cb1cce527b710d5736003e7d74a4896e053fe121beed8014b",
+ "public/assets/RNStatusPage-DHhXEvh5.js": "5894df2e4273208476cc1f88d9f027de224c61a4abbc8b0a697bdcae1e60dd32",
+ "public/assets/RNStatusPage-DTAG6m-B.js": "4b8564acbbc45104a50dcae3186ecf210cbc4516b721c29bbf0830fbb37f4d81",
+ "public/assets/RNStatusPage-DyHIMWIS.js": "7c8371dd3c400a31cf0795e3befc0481cfdc24a03d57f1e55eecdc3d7dde5007",
+ "public/assets/RNStatusPage-LNxrqC5V.js": "0ff1be162d4b5c36fe66994164f4606f6f7dca4be994909d3a648207ccfff86c",
+ "public/assets/RNStatusPage-nP-NnBNq.js": "42a63d8ceb7eda9196589ffeb151bfc5fade25d6e5b4ab60c05fc26693275435",
+ "public/assets/RNodeFlasherPage-BlEe_16U.js": "aec2b876192ae6d3a8d023fcf389ccf5eab7e7b9fe08ce242de427ceedffe0ba",
+ "public/assets/RobotoMonoNerdFont-Regular-DyU2aSNn.ttf": "3357fec1cce2d30c9a547ab35f5bd1742c005ce6343096427750bdf160be0a8d",
+ "public/assets/SettingsPage-B2NvFceQ.js": "1e3f221af2616af7a0289612f8023ded731106b07e1e30339f03d5d24bd53379",
+ "public/assets/SettingsPage-BQUh1tUa.js": "817973d93d98e4bb34ccac5dba8587801192e8a0b7fa51be1017008bb0151550",
+ "public/assets/SettingsPage-BTA4iAYq.js": "cb85dde7aa0476910bf0dcceb0bad242a1648f05a6288e67bbf2a50991318380",
+ "public/assets/SettingsPage-BUGPHwtI.js": "32e696172462d5baba26443be246224e55b69770880a2d3ac5a8fd5483cf8c11",
+ "public/assets/SettingsPage-BWB2qV6C.css": "6e1aee2c65ab471e2a4890178ac10f88c3849a59e2c0aa4a8b0c571e1b50a240",
+ "public/assets/SettingsPage-BaHpJhSS.js": "110bb4a3563a16ca0f9df53fbe9552f6a0f93012141a23a9a4f27eb8cac461ea",
+ "public/assets/SettingsPage-BlPc9PlL.js": "e6bf5a61abeabaadf9cc8c1d3868a3cf1e9b2615db3d691cd30e0b605fb4e67c",
+ "public/assets/SettingsPage-BmssvI6y.js": "c9108a55864e8f2088d4708b515f5172b78102ded19096774271b79ff42fd427",
+ "public/assets/SettingsPage-CYfLWd5w.js": "01ca1f7909c2adc7cf633386bb7f9a96182c4b1497f7bc1bbe2db3373e7ac440",
+ "public/assets/SettingsPage-Cb2_nZRb.js": "89042a562891d54d72057f05974c83b898ab607f3a8025a9248fd6c105cf4898",
+ "public/assets/SettingsPage-CnxrWsZe.js": "c9dc0924b67e643038c95a85448cd50d24952bbe93ea4e8ad5d19a31aefe335b",
+ "public/assets/SettingsPage-CtjAXkUk.js": "8469127b83d144af1a7feab00cdb9ad815fe5477c5c2f8d9f73808a5f9cc7156",
+ "public/assets/SettingsPage-Cz0lg0G9.js": "ae091a131d1df1224c04e831c84bdcc639886735975f4ffaf3e25cd1a3d2f442",
+ "public/assets/SettingsPage-D8v1LYHM.js": "edbfdac8b0fff4002a028d4b0d6f0a4f7e59c018841e63933b5d566d582b25f8",
+ "public/assets/SettingsPage-DNNaUueI.css": "94a4efae5d8a2181edb8c0084c6bcd146fa5883d458f087c3595185ce8613d9c",
+ "public/assets/SettingsPage-D_ODgYVz.js": "5b5d35973c93c935f9c731cbd09f8a672bb9e5b58c08438a86e2c69bc50fa859",
+ "public/assets/SettingsPage-DdgbM7p5.js": "3594fb935e9a5588d2e72318e2eaf9e852dadb4a5034166e2073058387a1498a",
+ "public/assets/SettingsPage-KhrqUKXb.js": "9060d18dd1bd03b008a2405fe3fb27e036c3f09b255680b08d7130c81db734f9",
+ "public/assets/SettingsPage-MkP7lVSP.js": "e7ea5e652fb54bed4779fc8db322f715d1cc2dfb831f3f607bc261e8c5f415ad",
+ "public/assets/SettingsPage-NdYUyyj7.js": "025db968ff36975cf2daed3f4ae5b16018dfd45236087d765e4a9afaaa6ca6d1",
+ "public/assets/SettingsPage-Z2YLdAhU.js": "a7e64da0d50c60ec1b1fca6f0ff592d7d685895dc0c599a06d03ee1b9a6b243e",
+ "public/assets/SettingsPage-_E4HIBwX.js": "d4d7cac2313b0a543615e58506f690f99833c883ac6d2b4ee2b26e5956a14275",
+ "public/assets/SettingsPage-piUsDFph.css": "749db426c7e6ac1908c73a6c0a09f9cd69fb1138958d043c026359f5d4dc73b4",
+ "public/assets/Toggle-59RCn4jY.js": "e190819576e499d02f118d1df8c06db03d7be266558d0100e6d3872398ea1beb",
+ "public/assets/Toggle-B23P06Ql.js": "1b5e45f32cf433ca71e96a12d516011acbb087587b916709e3d1fefa6d64eb67",
+ "public/assets/Toggle-B55QR0su.js": "02950f5a68b6fe738e39825dc7dcc5c0afa82677227f723d2013006f978d3a41",
+ "public/assets/Toggle-BHYEi1VG.js": "6ac766ce0ce10d61e286f0256b6f31fd95923571e8afba7e05bbaccbf6c5800e",
+ "public/assets/Toggle-BIziF9Iw.js": "bee87aa9038b535997584f6a1692d54b673e78d40e4781719bf652b8359a03aa",
+ "public/assets/Toggle-BJ3cL4O6.js": "e8b719abef326ee4c5a98c6b32604ed50c0eb2b169d0757039be55980d59b68b",
+ "public/assets/Toggle-BOBxd7lv.js": "9da76aac7f4801dfa49585425c45ee1a41d870730fa86aedba2d300283dad3a7",
+ "public/assets/Toggle-BrG7ascc.js": "395c73f3f1c433d3766fab564eed61ea3ba1e895ed7f16a6777c86b4163fcf07",
+ "public/assets/Toggle-ByyvHWcz.js": "2ae6a710b117555f6b518435c2cec1a8698077a4e1e3bc0237a0e52cc00ab0b7",
+ "public/assets/Toggle-C1eJWi3P.js": "28a4d307b0747821c42e1effa69f2483cc33c8a058dc0961d581087c92e5531d",
+ "public/assets/Toggle-C7yZtT8y.js": "4a31e89c1740bf907060cda0ae313fcc1fe6dffc9e931385a52718bbc743620e",
+ "public/assets/Toggle-CDqze-uV.js": "581f0b6631799fe8351eb639eaeae77fbeb414797ba376425f59c93faa70286d",
+ "public/assets/Toggle-CfxT6VP3.js": "e32283617de5e6488b5104bf4a976265fa8edf562faa28bcc8efbfc40e972a99",
+ "public/assets/Toggle-CvZO6wRO.js": "2382f825d23591b759638762352e216867c3e16bcfb6de05b848ab7cd52377e5",
+ "public/assets/Toggle-Di6uCFp1.js": "6cb9e7aaa5f99c1935653b5d67cd3e4955e68280a80e3d3524b22a33627715cc",
+ "public/assets/Toggle-DzZB-Ca-.js": "caa25fee9d0e1639382fd21ac5874c0cb404791ab92c98575153e241a47e53df",
+ "public/assets/Toggle-KICF86_Z.js": "73c5d62feec43e4689a84d08d172ee564ec127e8d23ae707206220f245feabd2",
+ "public/assets/Toggle-pfLCooS1.js": "d379760972f52e18e054a447e6010aeeac1d2c011aaaffa5dbd154e5f8c81649",
+ "public/assets/Toggle-q0STuMn3.js": "84d6968318b4d0d3c2284ceed841eee6f44e9c51a803de564624474b1a9b34de",
+ "public/assets/Toggle-qWK8RBtX.js": "05664494a7771378dbc527ce656d0c333a8799b9f9dd0624b43c6d0926c3f584",
+ "public/assets/ToolsPage--Z10aTLi.js": "5a2361fcc06573315270a10bbeeb16984d0bd8c3cf56d7deb5135b10879a9afa",
+ "public/assets/ToolsPage-B0FlDgbf.js": "3ba77f6b36b4bddcc2df5651ed87441762ccafd8c7e78fbdd94a48a76412fe6f",
+ "public/assets/ToolsPage-BAorvmOt.js": "a2a09143a3421c068aeab24efdaed1e7145e3748d1c62f18bc8678620efcb1f0",
+ "public/assets/ToolsPage-BE5NkXQB.js": "0a278f92cdbe177e13ca9fa6cedf774698f3c9f6b6f4e690cb3c5bb9a8ff67fb",
+ "public/assets/ToolsPage-BPN9J1bu.js": "b85977f856521310e5eca3524d655323afbd4c52052637b49d5a98abd8a2867d",
+ "public/assets/ToolsPage-BY5bRSRr.js": "2391ed3b659feab337ce254a150a8ba798a409ebf8139569b3ee8d5fd735cb45",
+ "public/assets/ToolsPage-BgNfJ8fh.js": "57546c75f72bf14e66c4769da529a4b7cb95f88ed7f2dd2127937aeaaccda18c",
+ "public/assets/ToolsPage-CCZUezpR.js": "f43dbe17e466c75d05e1f7d9fad87473c55627ffb0e2091d9f1f7df0b1bb7201",
+ "public/assets/ToolsPage-CIL1rxRX.js": "3929db20ca506dd8a0f5d472a05020b6d17ff19b05d1f5fbfc4de29c06a3c6a5",
+ "public/assets/ToolsPage-CPSXRsrJ.js": "6be53f8324013a9bf5ad594ef306a855153dfc61fbaa4ab7ca78b788ea2ff356",
+ "public/assets/ToolsPage-Cew0Sqhi.css": "e1b9d743705fa603a58891abe0593e8926429aabed9c8cd5d691bdc63a879e27",
+ "public/assets/ToolsPage-Cm6ojBq3.js": "ef96587aa53a4d8c372a6568d023766a15f855cb1285bcc5ec60736b5fc4b7df",
+ "public/assets/ToolsPage-D-IbKVrq.js": "a86c77d33d8d74e3ec54ff4a44134f0d0fcd7d9476a3b7f0f5337416fca56d08",
+ "public/assets/ToolsPage-DCqZsXeh.js": "0915f4ea91b2fd2245268693e263c2bab301e9102cbe3c9cc4ccbc5f6504639b",
+ "public/assets/ToolsPage-DHKGnt7Z.js": "514cb6228d057782556f7339071527cfc18e8bfddfb21ae90692feb252b7d71f",
+ "public/assets/ToolsPage-DTD8UxZd.js": "d91c74ee0ac8a88e73c60630edd6cc2081edfa503023dd00d266d65cf65f630c",
+ "public/assets/ToolsPage-DWpU2afb.js": "98d2bb2d51a8ce7db8d76bbb11ecf314eee807bd69b55b3c47cf60eb0c37dd90",
+ "public/assets/ToolsPage-DfjQvRAF.js": "f03a9b547353041bd26219408e1bad31e9986771c96e3a8c692fc62ca49b20c5",
+ "public/assets/ToolsPage-Dnc_orjh.js": "b1d79f9bfbe3f62b905b060100c9e4790834210fb02473ffd0318866966457c5",
+ "public/assets/ToolsPage-DvDwVZ8q.css": "8b40bbc801fb539e2346d30fe073f355e22a7c6f4f1fde6de2e4ea9ddd46d0c9",
+ "public/assets/ToolsPage-L38MWtvZ.js": "0dad49737c44ba1114cb0bdb7b8799f9ec0d49f0200c2a6d8af0355c4f95ae40",
+ "public/assets/ToolsPage-jGJtt1FO.js": "8fe7a078df4e0f36d6cf8ac4fe5dfd1db3cdd511cc5cf730ed1fd51662e1634c",
+ "public/assets/TranslatorPage-2Yezyf6n.js": "bcdc4098efae54479ee44c4a19f76f8a4c54dffdf580f979d005318ec6805979",
+ "public/assets/TranslatorPage-B9lOpJC8.js": "952cb88dcef6a892dbc871ae5b69def1f4fdc3b0d1b010e5d32dabcb1d8548f3",
+ "public/assets/TranslatorPage-BBnOy-9j.js": "3b350824bea7bb7abede2d7d4be55626706470ad69719547527e817b6a9a3e43",
+ "public/assets/TranslatorPage-BhB_cOYa.js": "dbfa31d1769aafa320be2de0b3e5c7d520296f8a57dae24777c56f59fe679271",
+ "public/assets/TranslatorPage-Bx-iamx_.js": "3b4268fa07113dcdf7fb7572f2ed8bba09bca596bb9cc7be1ac0988260d490d9",
+ "public/assets/TranslatorPage-BxiE4CTi.js": "88db0f1398eec72b401b07b94434d09bf56767ff3823d15f8e99a550d6f07658",
+ "public/assets/TranslatorPage-C1MrKE6r.js": "beb6a5f7ed42c0662044de209efd6e6d1a026e6c7d7e4cc46854ce1d1376bbfd",
+ "public/assets/TranslatorPage-C2D0qvec.js": "3f321eaf12c7981a6944df496dd8ce427e0680e758441093ca24a8c8f8633fc6",
+ "public/assets/TranslatorPage-CQs4_NoK.js": "a8d8838e74d631444196a11291a7299e4a75d378476510c46a294330d7620ac7",
+ "public/assets/TranslatorPage-CZ__7xGT.js": "7f765bf40e4a2c0382a8806142e67a1255a164fea3a3c124a498eaa584320964",
+ "public/assets/TranslatorPage-D0lqy7LK.js": "e24560834361754885f6e9b6b07233adc076bf109e769fb4a397ee857dd77078",
+ "public/assets/TranslatorPage-DU0_fIZo.js": "a0127d8ace8a56e1f5de1a844b40f100f6342258ea5c729147e6ce18db7ad9cd",
+ "public/assets/TranslatorPage-DYyPNK-E.js": "d38688427bdfabf261aaec97d5ae5323434887147869018e818abca639529d37",
+ "public/assets/TranslatorPage-DdhsGqd-.js": "2d3628cc34aabe5c667396046c96c61e3a53736745dc8f39f6cba38d09c55a6d",
+ "public/assets/TranslatorPage-Die2Kti8.js": "9b0d0a594e2b147a2fe1430cda8770d26e463ef2211644be2f93ee22e4609e2d",
+ "public/assets/TranslatorPage-DiyAD1yE.js": "d780a4aff40db62a2c57859c87f6b48b01b78c23e4b23c46488740cb1dbc06f1",
+ "public/assets/TranslatorPage-Dnyns-3_.js": "ceedc57a5251f582c21abb8848cbe032daeac2de2b94e589ca63117ae6834537",
+ "public/assets/TranslatorPage-Dvv62_Nt.js": "fda3d637c566626f81a0e0a7b35d82b3cdfb3d1d7536ee8725a1112411b35358",
+ "public/assets/TranslatorPage-Dz54TokK.js": "e825e1ab1b1bd1ed7cac4412a89841765aad1a70079b63c614a1c8b816ce306c",
+ "public/assets/TranslatorPage-r2ceAdNq.js": "832a2bb19c517aa4915101213d375b0891ebbfd7cb1163ee896702938183d2a5",
+ "public/assets/app-2fy0ix7T.css": "601334eab816b5d14c18632e689131acf4b5a36b223e63c5bf123acbae866d2f",
+ "public/assets/app-B6j1Aqua.js": "6c5e9758d44fc3096cdf20bb16d82a4e9ac04f83faa3dcd1793cc55824040ce6",
+ "public/assets/app-B8CKyts2.js": "c3ed5f12accc876c7f3597eff1ed212eb501fe8e73832b9715e4cd0a388e9a23",
+ "public/assets/app-BHB7Vsxd.js": "5831bb7c937c5bfc9597032a522f4952f9730f64e11c956e5be4bbb793d55a9a",
+ "public/assets/app-BOBXDFxj.js": "20b7aef1b45421bc64a7c8a8c1e32ae6e32c831a28dedc051c5ff5861aa84b52",
+ "public/assets/app-BXuILOrd.css": "9fbdfe449e583ed793c389fbaea80ad69b0a3f38025cbb4c1109eefc8819950a",
+ "public/assets/app-BaDr5OMd.js": "ca195a3822dbaaee8442308144826a57d2ee81d8d73d93aa5f9923c421bb79de",
+ "public/assets/app-BbDj6Q8X.js": "ce7025732322005c795d7202dfcf52a9cd4ce143149969cc1073d41fe6381a3a",
+ "public/assets/app-BbY1SChk.js": "dfc0594a5d3142b9220853d26bbf19803ab5d0721001b4f42f47131dd40f7190",
+ "public/assets/app-BmpTRjdT.js": "c2af7991c823b38c43d1e91bc824e1b984f76aa38b1c636326b19e1d96378726",
+ "public/assets/app-Bohj3HPH.js": "439c99979819fe2f65c621b8b8bae00fef9f6dacb520fbcf2acf5685f290a87a",
+ "public/assets/app-C4nDn0Na.js": "77d4d6975479c3fb608238b69b0abc50f1a46eec980a0c1be53d9622bd2d4a8d",
+ "public/assets/app-CE3Hv6a6.js": "81aca058b7bd320fca3b65d92e5a7c5e6e851318fcaa854cbe712cdf1b670696",
+ "public/assets/app-CTRkibwF.css": "b8f7a7d52f31af48e35ca0c2a8670edd64c4f28361b4eb412a00f28597221e90",
+ "public/assets/app-CTqOzAzO.js": "6aa9e4f4366a4769220f697be7dac38146d645658190e33c7145bee4bfb98e02",
+ "public/assets/app-Cj_1FtQw.css": "cf2e01aaf6fad80d752baf7a3f07d4d7dc08ea4d38316f341d5634e1c952c926",
+ "public/assets/app-CnWI1kjY.js": "890f181a79455eabdbf26cc9ca4eab34ea3091da92ad3b905de8297c9a8f0e7d",
+ "public/assets/app-CwKr_yxB.css": "caeb23a9c6bf10c22b8d156e1d96dbc3e72d18ee76ac37be9885831cd62868ab",
+ "public/assets/app-DTD_JJvV.css": "8f549a4267d38e01ba9af00e4287bc93b9516e68aae18819f6bc5ea1d509bab9",
+ "public/assets/app-DTNPJDnD.css": "795b62ed84ce576bf737e9e43276b4a09fd7087233abfdb6b50bf33a8c46b011",
+ "public/assets/app-DjEvJFWn.js": "9b78392a3df0b616fa569cab8f441a338573e9a028471405892ba0368014d56e",
+ "public/assets/app-DsETXe-k.js": "b935ea6a5c9ed4cf93c1128812803ba272a2d4d77eb857631a949f35e6fb0ead",
+ "public/assets/app-OYNH2PgU.js": "0888811e513a882dc4259a6b94fa29279d95c68bb258a975583cadeb312f55a4",
+ "public/assets/app-QAFEbTCA.js": "9c9e9e3313b36c9e03aadb705c21fae67d232290218796a00419bbde748e27e3",
+ "public/assets/app-RFBX_G6w.js": "63bd0ea6fab70f05d4801aa7b95c3461246c3ecf20d5fe4a7da34ad664a33b96",
+ "public/assets/app-_GNIkRr2.js": "1351b5f5973f2b41a814d2e938eeca2581313a247463a3fd76c5686d635a46e7",
+ "public/assets/app-zuyAIlIs.js": "a7c41ab6e15ea121781a8b7da09c33a67431219a2253ba78dabb588739aec470",
+ "public/assets/images/logo-chat-bubble.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "public/assets/images/logo.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "public/assets/images/network-visualiser/interface_connected.png": "a6f2e0a1efb5949789bc47a15922e3d2f443d51cee30b984b50d7576a5e95e7f",
+ "public/assets/images/network-visualiser/interface_disconnected.png": "948f78f1957ffa821114bd18d4cf13986c65269055eedd106be252b44274fd9a",
+ "public/assets/images/network-visualiser/server.png": "9f995a1dbb06232d71be176267199439b923d5898e076c890dea01b6a9b16535",
+ "public/assets/images/network-visualiser/server_1hop.png": "7a3ad9dbe673dd2ef8a5b7d90ac9c276d436d8b1d16bb69f8ce84e40f5bcfb92",
+ "public/assets/images/network-visualiser/user.png": "bcad4e7a6bcde488199f23e9fd6c60a6fd928c05f079175499785c5636f13796",
+ "public/assets/images/network-visualiser/user_1hop.png": "91aa213e0d7d8ae55c5d89c79e77cc37ff3bc5d405876af91cb70ea1ac16cd2a",
+ "public/assets/images/reticulum_logo_512.png": "035f499a1619cfb6d2da2ca99539e9e9d122bb18addf2ab83d3413592e7662f9",
+ "public/assets/js/codec2-emscripten/c2dec.js": "5771ab23ccd1fc7c99b1b9a257461951454918dad23ecd8b549c651540cc078d",
+ "public/assets/js/codec2-emscripten/c2dec.wasm": "24f8611ba983641ee3582f1ad12163697b582134308bba2449eec1ae30935547",
+ "public/assets/js/codec2-emscripten/c2enc.js": "e7b155ab6333b71ec2fabe32a55fc443db167be7491c27bb68948388c162d402",
+ "public/assets/js/codec2-emscripten/c2enc.wasm": "4cf5e44036256236b5f440bc6dfd338d9d049a242a3bb90756dac68a43b31efd",
+ "public/assets/js/codec2-emscripten/codec2-lib.js": "9d0a78ea1db26314d34dbd09921d625df866ae47cd8db511b0bbb2e78f0e950e",
+ "public/assets/js/codec2-emscripten/codec2-microphone-recorder.js": "b7bd6721b30881f1c3ec8d6461e15d6bba94a8c6a4eac6be0dc8214a3b0863b3",
+ "public/assets/js/codec2-emscripten/index.html": "67b3a8c8777f87a5bd9383ad188e6fb5025c6131628b354d8c0c0ebfae6175b7",
+ "public/assets/js/codec2-emscripten/processor.js": "efe9a88a4b1ba8ad72373480e976b496632097d0344997bcf4b93d5e7c7b6bd9",
+ "public/assets/js/codec2-emscripten/sox.js": "e1c13c18a90e7b1518f0830cf1d2b263856f2276381278eb78afe25b28814a70",
+ "public/assets/js/codec2-emscripten/sox.wasm": "eab8957398b7df78550e5d74bdbe38dd232ad5e6d68fc874daa78a9ed669753e",
+ "public/assets/js/codec2-emscripten/wav-encoder.js": "dfeec66f1ffeda1b783d240afa85141c77df3e5e6bfb0f12caa89c586c3e6b18",
+ "public/assets/js/tailwindcss/tailwind-v3.4.3-forms-v0.5.7.js": "1829e78dfbc21c0929c4fc257e849d054dd7162f4bf2a5f5676617fedd990e54",
+ "public/assets/logo-DZE3PCxd.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "public/assets/materialdesignicons-webfont-B7mPwVP_.ttf": "61e8aba5a4e981fe22cf7c8e8bcdbea00476e75c62c37f01bf7ee33361d68428",
+ "public/assets/materialdesignicons-webfont-CSr8KVlo.eot": "0b183104d2fc5f26196e773c77bdaf2e05509fd4259d2d15ecedca79b87e84f9",
+ "public/assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "662fefa8f2f8a95c18588d21774789c107c64e771cbe65a69af46291c4311afc",
+ "public/assets/materialdesignicons-webfont-PXm3-2wK.woff": "a5928a0d5c2f624e46f98d9b15c2f60045377f7c594dd78a1759132ea3b463eb",
+ "public/assets/proto/audio_call.proto": "db67d003f56bf1f8317913deeac6ecb55760c573c82f350cacfd6450da4260fa",
+ "public/assets/vendor-axios-C1it03rL.js": "03842a2abe5c255e5e77227c5a50978b76230f5639302ad531bafe5552ee16e7",
+ "public/assets/vendor-compressor-DH721-V_.js": "0d60c566c6074e3a14899a7eef34de5fbf100c060cdb7f91c85c17393ae2df12",
+ "public/assets/vendor-dayjs-Bm9JdU5I.js": "0e7b1d2a8b6a9f404245fc05c44363797e8ff0a9263796c593aba3924ff15591",
+ "public/assets/vendor-mdi-BDiqFXHQ.js": "bf220609d423893e0a456f755b3146cc5c8477891b2d5bb999fcfc8f5c61e737",
+ "public/assets/vendor-mdi-Cx2MC6_s.js": "2e568519042465df31a18333c29eb8d32d4a935f2ed033f76c8eb147bea222f3",
+ "public/assets/vendor-micron-BSEEgE84.js": "a66dee6052d9e0008f7295d581178addecb939553f72f536bf5b67bed87285fd",
+ "public/assets/vendor-micron-DU_TH2sZ.js": "1b0bf55b194ec42669c46d877185f82ec71d88dbb878ba93381c42db0a8adf7d",
+ "public/assets/vendor-mitt-BHPWSuhB.js": "ed25e2504b52c9fe7e4ddd6942bbcf1963d347dd112bec223f25666dfd8b6845",
+ "public/assets/vendor-other-BjIYm04z.css": "cfce4b37252781143ea9b1c6bdbdb1348e0b77194ec89ccc19a5e00d2d365e2f",
+ "public/assets/vendor-other-BtPCEgEn.css": "7f80cd941e5d83568410726dadb7f2a05e47fd819961b76c744b88cbb64d0519",
+ "public/assets/vendor-other-C0noCZhC.js": "cca9b42fdf038917f8866c1f9d4750081d5f402bd2042b61346190da94b3bf35",
+ "public/assets/vendor-other-DktJSGWy.js": "cca9b42fdf038917f8866c1f9d4750081d5f402bd2042b61346190da94b3bf35",
+ "public/assets/vendor-vis-CfGaKk2g.css": "29ca7c5984322088d17495b1e842dc3b612893a0d07b3d004a00dc3a37c23be9",
+ "public/assets/vendor-vis-DW7fmx29.js": "9e93cc024f5ff1bcc50a5cd2a71ba6184258109d7160aee1e9fb66ae5941ca3e",
+ "public/assets/vendor-vue-DpQ2LQiZ.js": "887b6b1c046857e64597df74c7845578798ade35dacdfa88ecb569b20debeb93",
+ "public/assets/vendor-vue-XbqVpb8f.js": "ac54e340d86d33d265fd8a3f3e3c64334ec3dd50106506c100defbaa80a9dc81",
+ "public/assets/vendor-vue-router-B-dvAhom.js": "38550e69ae685e1d9f5c405ce019b70a808d84bfb2a6ae46ac93a18a2aa44a9d",
+ "public/assets/vendor-vue-router-DNECaeJa.js": "8f40faea305bdf48a74b198e2a4cf57aad2584d27c649926908092dfe3346614",
+ "public/assets/vendor-vuetify-BLqNJyZz.js": "ab7479f05c00ded360c0dabb266e57a260385782ee1db27973907892400b8793",
+ "public/assets/vendor-vuetify-CZPGfs0P.js": "65924b51d3aa97e6b2b6c2537a6de5e03d5c502cfd6a32a763efe3f4090539a5",
+ "public/assets/vendor-vuetify-Pi5piU4G.css": "3bfdb31e32b3a58f3d73a72709fa746a49b5080afdb80e6312d142bbc2d1b3e6",
+ "public/favicons/favicon-512x512.png": "2d73e0e18141cbcebf0a38c31c2f5152370291f6eb8eeb65a7fd02a29d9b82da",
+ "public/index.html": "12b6b63d5bb8164a855a6166e742792db319a3e26ec32ff91f2c277ebc4b3874",
+ "public/manifest.json": "3087f201e01ba1e4783999433b9cbd34071a634f737b932c288bd2b0bbba405a",
+ "public/meshchatx-docs/meshchat_on_android_with_termux.md": "66b5ddd5611a5bde02072e6e3ec4a6af01c7baaba90531b2d3e385ea5ad58a70",
+ "public/meshchatx-docs/meshchat_on_docker.md": "6c0f0874d08188435d694f0d73114485cbebcfa16459e4c52ecd3f86b794fc4d",
+ "public/meshchatx-docs/meshchat_on_raspberry_pi.md": "6a9db4284c00ea2e0443bdab124e256d3daf89489482141ed124c8115a62e360",
+ "public/rnode-flasher/LICENSE": "4e590a1cbb467d60c6c55ca547dc71517955098d13d5483e3d9191fc03af44df",
+ "public/rnode-flasher/README.md": "d453c7d31a69ff39fea6d096cba10fb8025a3eeef9c17e310ff38ce60adf311f",
+ "public/rnode-flasher/index.html": "496fbd47d8879846812ba1e8895d3ea2451dc7686b374f3a47e4420b2f915865",
+ "public/rnode-flasher/js/crypto-js@3.9.1-1/core.js": "4c350747271d3901045e9f6939ec2f0edd40dc6140bec6b8e540b66d80310b86",
+ "public/rnode-flasher/js/crypto-js@3.9.1-1/md5.js": "1d7f30238bedb8d3016abb0f4096480d960e1d1668720668d47dd39f80f24a48",
+ "public/rnode-flasher/js/esptool-js@0.4.5/bundle.js": "6320195516fa7974926025e3f33d0fd4a18cab3e1cf26526b9e2c079007176b0",
+ "public/rnode-flasher/js/nrf52_dfu_flasher.js": "f7f48c88357dae487d724cbb735af12a93b0843aa75183d1dfd51b4be82c6f54",
+ "public/rnode-flasher/js/rnode.js": "31583723b56724d3485873d49a8eb4abe07587462f700dd25a2f9eae02ab4f22",
+ "public/rnode-flasher/js/tailwindcss/tailwind-v3.4.3-forms-v0.5.7.js": "1829e78dfbc21c0929c4fc257e849d054dd7162f4bf2a5f5676617fedd990e54",
+ "public/rnode-flasher/js/vue@3.4.26/dist/vue.global.js": "c71ec2d9f47acae53c0202acbf771c1e06e13943708c8e7a4ef76f733b91e2b5",
+ "public/rnode-flasher/js/web-serial-polyfill@1.0.15/dist/serial.js": "739e8a556a1453c87a619b2520dcbda39f0cea55c5d0bf865bc5967e7e4fcad0",
+ "public/rnode-flasher/js/zip.min.js": "4435d44e680530b0965c7219227f14601f56fd703a27dc7844c1b78fa4501b76",
+ "public/rnode-flasher/reticulum_logo_512.png": "035f499a1619cfb6d2da2ca99539e9e9d122bb18addf2ab83d3413592e7662f9",
+ "public/service-worker.js": "33d3c60e6a84f1e43ffdb03a32a96d8d87e716f9dbf3828896810c91cc694d5c"
+ }
+}
diff --git a/electron/main.js b/electron/main.js
index ee86e316..40f541f6 100644
--- a/electron/main.js
+++ b/electron/main.js
@@ -350,7 +350,7 @@ app.whenReady().then(async () => {
"style-src 'self' 'unsafe-inline'",
"img-src 'self' data: blob: https://*.tile.openstreetmap.org https://tile.openstreetmap.org",
"font-src 'self' data:",
- "connect-src 'self' http://localhost:9337 https://localhost:9337 ws://localhost:* wss://localhost:* blob: https://*.tile.openstreetmap.org https://tile.openstreetmap.org https://nominatim.openstreetmap.org https://api.github.com https://objects.githubusercontent.com https://github.com",
+ "connect-src 'self' http://localhost:9337 https://localhost:9337 ws://localhost:* wss://localhost:* blob: https://*.tile.openstreetmap.org https://tile.openstreetmap.org https://nominatim.openstreetmap.org https://git.quad4.io",
"media-src 'self' blob:",
"worker-src 'self' blob:",
"frame-src 'self'",
diff --git a/meshchatx/meshchat.py b/meshchatx/meshchat.py
index 8df3c8df..8f8fda9f 100644
--- a/meshchatx/meshchat.py
+++ b/meshchatx/meshchat.py
@@ -1756,8 +1756,8 @@ class ReticulumMeshChat:
timestamp=time.time(),
)
- # Trigger missed call notification if it was an incoming call that ended while ringing
- if is_incoming and status_code == 4:
+ # Trigger missed call notification if it was an incoming call that ended without being established
+ if is_incoming and not self.telephone_manager.call_was_established:
# Check if we should suppress the notification/websocket message
# If DND was on, we still record it but maybe skip the noisy websocket?
# Actually, persistent notification is good.
@@ -1812,7 +1812,9 @@ class ReticulumMeshChat:
target_name = None
if target_hash:
try:
- contact = ctx.database.contacts.get_contact_by_hash(target_hash)
+ contact = ctx.database.contacts.get_contact_by_identity_hash(
+ target_hash
+ )
if contact:
target_name = contact.name
except Exception: # noqa: S110
@@ -2264,7 +2266,7 @@ class ReticulumMeshChat:
return web.json_response({"error": "URL is required"}, status=400)
# Restrict to GitHub for safety
- if not url.startswith("https://github.com/") and not url.startswith(
+ if not url.startswith("https://git.quad4.io/") and not url.startswith(
"https://objects.githubusercontent.com/"
):
return web.json_response({"error": "Invalid download URL"}, status=403)
@@ -3330,9 +3332,48 @@ class ReticulumMeshChat:
# update docs
@routes.post("/api/v1/docs/update")
async def docs_update(request):
- success = self.docs_manager.update_docs()
+ version = request.query.get("version", "latest")
+ success = self.docs_manager.update_docs(version=version)
return web.json_response({"success": success})
+ # upload docs zip
+ @routes.post("/api/v1/docs/upload")
+ async def docs_upload(request):
+ try:
+ reader = await request.multipart()
+ field = await reader.next()
+ if field.name != "file":
+ return web.json_response(
+ {"error": "No file field in multipart request"}, status=400
+ )
+
+ version = request.query.get("version")
+ if not version:
+ # use timestamp if no version provided
+ version = f"upload-{int(time.time())}"
+
+ zip_data = await field.read()
+ success = self.docs_manager.upload_zip(zip_data, version)
+ return web.json_response({"success": success, "version": version})
+ except Exception as e:
+ return web.json_response({"error": str(e)}, status=500)
+
+ # switch docs version
+ @routes.post("/api/v1/docs/switch")
+ async def docs_switch(request):
+ try:
+ data = await request.json()
+ version = data.get("version")
+ if not version:
+ return web.json_response(
+ {"error": "No version provided"}, status=400
+ )
+
+ success = self.docs_manager.switch_version(version)
+ return web.json_response({"success": success})
+ except Exception as e:
+ return web.json_response({"error": str(e)}, status=500)
+
# search docs
@routes.get("/api/v1/docs/search")
async def docs_search(request):
@@ -3875,7 +3916,7 @@ class ReticulumMeshChat:
initiation_target_name = None
if initiation_target_hash:
try:
- contact = self.database.contacts.get_contact_by_hash(
+ contact = self.database.contacts.get_contact_by_identity_hash(
initiation_target_hash
)
if contact:
@@ -4230,7 +4271,9 @@ class ReticulumMeshChat:
"greeting.opus",
)
if os.path.exists(filepath):
- return web.FileResponse(filepath)
+ return web.FileResponse(
+ filepath, headers={"Content-Type": "audio/opus"}
+ )
return web.json_response(
{"message": "Greeting audio not found"},
status=404,
@@ -4240,6 +4283,16 @@ class ReticulumMeshChat:
@routes.get("/api/v1/telephone/voicemails/{id}/audio")
async def telephone_voicemail_audio(request):
voicemail_id = request.match_info.get("id")
+ try:
+ voicemail_id = int(voicemail_id)
+ except (ValueError, TypeError):
+ return web.json_response({"message": "Invalid voicemail ID"}, status=400)
+
+ if not self.voicemail_manager:
+ return web.json_response(
+ {"message": "Voicemail manager not available"}, status=503
+ )
+
voicemail = self.database.voicemails.get_voicemail(voicemail_id)
if voicemail:
filepath = os.path.join(
@@ -4247,7 +4300,10 @@ class ReticulumMeshChat:
voicemail["filename"],
)
if os.path.exists(filepath):
- return web.FileResponse(filepath)
+ # Browsers might need a proper content type for .opus files
+ return web.FileResponse(
+ filepath, headers={"Content-Type": "audio/opus"}
+ )
RNS.log(
f"Voicemail: Recording file missing for ID {voicemail_id}: {filepath}",
RNS.LOG_ERROR,
@@ -4288,6 +4344,13 @@ class ReticulumMeshChat:
@routes.get("/api/v1/telephone/recordings/{id}/audio/{side}")
async def telephone_recording_audio(request):
recording_id = request.match_info.get("id")
+ try:
+ recording_id = int(recording_id)
+ except (ValueError, TypeError):
+ return web.json_response(
+ {"message": "Invalid recording ID"}, status=400
+ )
+
side = request.match_info.get("side") # rx or tx
recording = self.database.telephone.get_call_recording(recording_id)
if recording:
@@ -4302,7 +4365,9 @@ class ReticulumMeshChat:
filename,
)
if os.path.exists(filepath):
- return web.FileResponse(filepath)
+ return web.FileResponse(
+ filepath, headers={"Content-Type": "audio/opus"}
+ )
return web.json_response({"message": "Recording not found"}, status=404)
@@ -7105,6 +7170,14 @@ class ReticulumMeshChat:
response.headers["Content-Type"] = "application/wasm"
elif path.endswith(".html"):
response.headers["Content-Type"] = "text/html; charset=utf-8"
+ elif path.endswith(".opus"):
+ response.headers["Content-Type"] = "audio/opus"
+ elif path.endswith(".ogg"):
+ response.headers["Content-Type"] = "audio/ogg"
+ elif path.endswith(".wav"):
+ response.headers["Content-Type"] = "audio/wav"
+ elif path.endswith(".mp3"):
+ response.headers["Content-Type"] = "audio/mpeg"
return response
# security headers middleware
@@ -7135,7 +7208,7 @@ class ReticulumMeshChat:
"style-src 'self' 'unsafe-inline'; "
"img-src 'self' data: blob: https://*.tile.openstreetmap.org https://tile.openstreetmap.org; "
"font-src 'self' data:; "
- "connect-src 'self' ws://localhost:* wss://localhost:* blob: https://*.tile.openstreetmap.org https://tile.openstreetmap.org https://nominatim.openstreetmap.org https://api.github.com https://objects.githubusercontent.com https://github.com; "
+ "connect-src 'self' ws://localhost:* wss://localhost:* blob: https://*.tile.openstreetmap.org https://tile.openstreetmap.org https://nominatim.openstreetmap.org https://git.quad4.io; "
"media-src 'self' blob:; "
"worker-src 'self' blob:; "
"frame-src 'self'; "
@@ -7335,7 +7408,7 @@ class ReticulumMeshChat:
ctx.message_router.announce_propagation_node()
# send announce for telephone
- ctx.telephone_manager.announce()
+ ctx.telephone_manager.announce(display_name=ctx.config.display_name.get())
# tell websocket clients we just announced
await self.send_announced_to_websocket_clients(context=ctx)
@@ -8629,7 +8702,7 @@ class ReticulumMeshChat:
announce["app_data"],
)
elif announce["aspect"] == "lxst.telephony":
- display_name = announce.get("display_name") or "Anonymous Peer"
+ display_name = parse_lxmf_display_name(announce["app_data"])
# Try to find associated LXMF destination hash if this is a telephony announce
lxmf_destination_hash = None
@@ -9452,7 +9525,8 @@ class ReticulumMeshChat:
print(
"Received an announce from "
+ RNS.prettyhexrep(destination_hash)
- + " for [lxst.telephony]",
+ + " for [lxst.telephony]"
+ + (f" ({display_name})" if (display_name := parse_lxmf_display_name(base64.b64encode(app_data).decode() if app_data else None, None)) else "")
)
# track announce timestamp
diff --git a/meshchatx/src/backend/docs_manager.py b/meshchatx/src/backend/docs_manager.py
index 7064a173..513839e5 100644
--- a/meshchatx/src/backend/docs_manager.py
+++ b/meshchatx/src/backend/docs_manager.py
@@ -19,29 +19,33 @@ class DocsManager:
self.storage_dir = storage_dir
# Determine docs directories
- # If storage_dir is provided, we prefer using it for documentation storage
- # to avoid Read-only file system errors in environments like AppImages.
if self.storage_dir:
- self.docs_dir = os.path.join(self.storage_dir, "reticulum-docs")
+ self.docs_base_dir = os.path.join(self.storage_dir, "reticulum-docs")
self.meshchatx_docs_dir = os.path.join(self.storage_dir, "meshchatx-docs")
else:
- self.docs_dir = os.path.join(self.public_dir, "reticulum-docs")
+ self.docs_base_dir = os.path.join(self.public_dir, "reticulum-docs")
self.meshchatx_docs_dir = os.path.join(self.public_dir, "meshchatx-docs")
+ # The actual docs are served from this directory
+ # We will use a 'current' subdirectory for the active version
+ self.docs_dir = os.path.join(self.docs_base_dir, "current")
+ self.versions_dir = os.path.join(self.docs_base_dir, "versions")
+
self.download_status = "idle"
self.download_progress = 0
self.last_error = None
# Ensure docs directories exist
try:
- if not os.path.exists(self.docs_dir):
- os.makedirs(self.docs_dir)
+ for d in [self.docs_base_dir, self.versions_dir, self.meshchatx_docs_dir]:
+ if not os.path.exists(d):
+ os.makedirs(d)
+
+ # If 'current' doesn't exist but we have versions, pick the latest one
+ if not os.path.exists(self.docs_dir) or not os.listdir(self.docs_dir):
+ self._update_current_link()
- if not os.path.exists(self.meshchatx_docs_dir):
- os.makedirs(self.meshchatx_docs_dir)
except OSError as e:
- # If we still fail (e.g. storage_dir was not provided and public_dir is read-only)
- # we log it but don't crash the whole app. Emergency mode can still run.
logging.error(f"Failed to create documentation directories: {e}")
self.last_error = str(e)
@@ -51,6 +55,75 @@ class DocsManager:
):
self.populate_meshchatx_docs()
+ def _update_current_link(self, version=None):
+ """Updates the 'current' directory to point to the specified version or the latest one."""
+ if not os.path.exists(self.versions_dir):
+ return
+
+ versions = self.get_available_versions()
+ if not versions:
+ return
+
+ target_version = version
+ if not target_version:
+ # Pick latest version (alphabetically)
+ target_version = versions[-1]
+
+ version_path = os.path.join(self.versions_dir, target_version)
+ if not os.path.exists(version_path):
+ return
+
+ # On some systems symlinks might fail or be restricted, so we use a directory copy or move
+ # but for now let's try to just use the path directly if possible.
+ # However, meshchat.py uses self.docs_dir for the static route.
+
+ # To make it simple and robust across platforms, we'll clear 'current' and copy the version
+ if os.path.exists(self.docs_dir):
+ if os.path.islink(self.docs_dir):
+ os.unlink(self.docs_dir)
+ else:
+ shutil.rmtree(self.docs_dir)
+
+ try:
+ # Try symlink first as it's efficient
+ os.symlink(version_path, self.docs_dir)
+ except (OSError, AttributeError):
+ # Fallback to copy
+ shutil.copytree(version_path, self.docs_dir)
+
+ def get_available_versions(self):
+ if not os.path.exists(self.versions_dir):
+ return []
+ versions = [
+ d
+ for d in os.listdir(self.versions_dir)
+ if os.path.isdir(os.path.join(self.versions_dir, d))
+ ]
+ return sorted(versions)
+
+ def get_current_version(self):
+ if not os.path.exists(self.docs_dir):
+ return None
+
+ if os.path.islink(self.docs_dir):
+ return os.path.basename(os.readlink(self.docs_dir))
+
+ # If it's a copy, we might need a metadata file to know which version it is
+ version_file = os.path.join(self.docs_dir, ".version")
+ if os.path.exists(version_file):
+ try:
+ with open(version_file, "r") as f:
+ return f.read().strip()
+ except OSError:
+ pass
+ return "unknown"
+
+ def switch_version(self, version):
+ if version in self.get_available_versions():
+ self._update_current_link(version)
+ return True
+ return False
+
def populate_meshchatx_docs(self):
"""Populates meshchatx-docs from the project's docs folder."""
# Try to find docs folder in several places
@@ -134,6 +207,8 @@ class DocsManager:
"last_error": self.last_error,
"has_docs": self.has_docs(),
"has_meshchatx_docs": self.has_meshchatx_docs(),
+ "versions": self.get_available_versions(),
+ "current_version": self.get_current_version(),
}
def has_meshchatx_docs(self):
@@ -340,32 +415,36 @@ class DocsManager:
return results
def has_docs(self):
- # Check if index.html exists in the docs folder or if config says so
+ # Check if index.html exists in the docs folder or if we have any versions
if self.config.docs_downloaded.get():
return True
- return os.path.exists(os.path.join(self.docs_dir, "index.html"))
+ return (
+ os.path.exists(os.path.join(self.docs_dir, "index.html"))
+ or len(self.get_available_versions()) > 0
+ )
- def update_docs(self):
+ def update_docs(self, version="latest"):
if (
self.download_status == "downloading"
or self.download_status == "extracting"
):
return False
- thread = threading.Thread(target=self._download_task)
+ thread = threading.Thread(target=self._download_task, args=(version,))
thread.daemon = True
thread.start()
return True
- def _download_task(self):
+ def _download_task(self, version="latest"):
self.download_status = "downloading"
self.download_progress = 0
self.last_error = None
try:
# We use the reticulum_website repository which contains the built HTML docs
- url = "https://github.com/markqvist/reticulum_website/archive/refs/heads/main.zip"
- zip_path = os.path.join(self.docs_dir, "website.zip")
+ # Default to git.quad4.io as requested
+ url = "https://git.quad4.io/Reticulum/reticulum_website/archive/main.zip"
+ zip_path = os.path.join(self.docs_base_dir, "website.zip")
# Download ZIP
response = requests.get(url, stream=True, timeout=60)
@@ -386,7 +465,13 @@ class DocsManager:
# Extract
self.download_status = "extracting"
- self._extract_docs(zip_path)
+ # For automatic downloads from git, we'll use a timestamp as version if none provided
+ if version == "latest":
+ import time
+
+ version = f"git-{int(time.time())}"
+
+ self._extract_docs(zip_path, version)
# Cleanup
if os.path.exists(zip_path):
@@ -395,50 +480,104 @@ class DocsManager:
self.config.docs_downloaded.set(True)
self.download_progress = 100
self.download_status = "completed"
+
+ # Switch to the new version
+ self.switch_version(version)
+
except Exception as e:
self.last_error = str(e)
self.download_status = "error"
logging.exception(f"Failed to update docs: {e}")
- def _extract_docs(self, zip_path):
+ def upload_zip(self, zip_bytes, version):
+ self.download_status = "extracting"
+ self.download_progress = 0
+ self.last_error = None
+
+ try:
+ zip_path = os.path.join(self.docs_base_dir, "uploaded.zip")
+ with open(zip_path, "wb") as f:
+ f.write(zip_bytes)
+
+ self._extract_docs(zip_path, version)
+
+ if os.path.exists(zip_path):
+ os.remove(zip_path)
+
+ self.download_status = "completed"
+ self.download_progress = 100
+ self.switch_version(version)
+ return True
+ except Exception as e:
+ self.last_error = str(e)
+ self.download_status = "error"
+ logging.exception(f"Failed to upload docs: {e}")
+ return False
+
+ def _extract_docs(self, zip_path, version):
+ # Target dir for this version
+ version_dir = os.path.join(self.versions_dir, version)
+ if os.path.exists(version_dir):
+ shutil.rmtree(version_dir)
+ os.makedirs(version_dir)
+
# Temp dir for extraction
- temp_extract = os.path.join(self.docs_dir, "temp_extract")
+ temp_extract = os.path.join(self.docs_base_dir, "temp_extract")
if os.path.exists(temp_extract):
shutil.rmtree(temp_extract)
with zipfile.ZipFile(zip_path, "r") as zip_ref:
- # GitHub zips have a root folder like reticulum_website-main/
- # We want the contents of reticulum_website-main/docs/
- root_folder = zip_ref.namelist()[0].split("/")[0]
- docs_prefix = f"{root_folder}/docs/"
-
- members_to_extract = [
- m for m in zip_ref.namelist() if m.startswith(docs_prefix)
- ]
+ # Gitea/GitHub zips have a root folder
+ namelist = zip_ref.namelist()
+ if not namelist:
+ raise Exception("Zip file is empty")
- for member in members_to_extract:
- zip_ref.extract(member, temp_extract)
+ root_folder = namelist[0].split("/")[0]
- src_path = os.path.join(temp_extract, root_folder, "docs")
+ # Check if it's the reticulum_website repo (has docs/ folder)
+ docs_prefix = f"{root_folder}/docs/"
+ has_docs_subfolder = any(m.startswith(docs_prefix) for m in namelist)
- # Clear existing docs except for the temp folder
- for item in os.listdir(self.docs_dir):
- item_path = os.path.join(self.docs_dir, item)
- if item != "temp_extract" and item != "website.zip":
- if os.path.isdir(item_path):
- shutil.rmtree(item_path)
- else:
- os.remove(item_path)
+ if has_docs_subfolder:
+ members_to_extract = [m for m in namelist if m.startswith(docs_prefix)]
+ for member in members_to_extract:
+ zip_ref.extract(member, temp_extract)
- # Move files from extracted docs to docs_dir
- if os.path.exists(src_path):
+ src_path = os.path.join(temp_extract, root_folder, "docs")
+ # Move files from extracted docs to version_dir
for item in os.listdir(src_path):
s = os.path.join(src_path, item)
- d = os.path.join(self.docs_dir, item)
+ d = os.path.join(version_dir, item)
if os.path.isdir(s):
shutil.copytree(s, d)
else:
shutil.copy2(s, d)
+ else:
+ # Just extract everything directly to version_dir, but remove root folder if exists
+ zip_ref.extractall(temp_extract)
+ src_path = os.path.join(temp_extract, root_folder)
+ if os.path.exists(src_path) and os.path.isdir(src_path):
+ for item in os.listdir(src_path):
+ s = os.path.join(src_path, item)
+ d = os.path.join(version_dir, item)
+ if os.path.isdir(s):
+ shutil.copytree(s, d)
+ else:
+ shutil.copy2(s, d)
+ else:
+ # Fallback if no root folder
+ for item in os.listdir(temp_extract):
+ s = os.path.join(temp_extract, item)
+ d = os.path.join(version_dir, item)
+ if os.path.isdir(s):
+ shutil.copytree(s, d)
+ else:
+ shutil.copy2(s, d)
+
+ # Create a metadata file with the version name
+ with open(os.path.join(version_dir, ".version"), "w") as f:
+ f.write(version)
# Cleanup temp
- shutil.rmtree(temp_extract)
+ if os.path.exists(temp_extract):
+ shutil.rmtree(temp_extract)
diff --git a/meshchatx/src/backend/telephone_manager.py b/meshchatx/src/backend/telephone_manager.py
index 9b22c171..ceebab91 100644
--- a/meshchatx/src/backend/telephone_manager.py
+++ b/meshchatx/src/backend/telephone_manager.py
@@ -1,4 +1,5 @@
import asyncio
+import base64
import os
import time
@@ -61,6 +62,7 @@ class TelephoneManager:
self.call_start_time = None
self.call_status_at_end = None
self.call_is_incoming = False
+ self.call_was_established = False
# Manual mute overrides in case LXST internal muting is buggy
self.transmit_muted = False
@@ -82,6 +84,8 @@ class TelephoneManager:
self.telephone = Telephone(self.identity)
# Disable busy tone played on caller side when remote side rejects, or doesn't answer
self.telephone.set_busy_tone_time(0)
+ # Increase connection timeout for slower networks
+ self.telephone.set_connect_timeout(30)
# Set initial profile from config
if self.config_manager:
@@ -109,12 +113,14 @@ class TelephoneManager:
def on_telephone_ringing(self, caller_identity: RNS.Identity):
self.call_start_time = time.time()
self.call_is_incoming = True
+ self.call_was_established = False
if self.on_ringing_callback:
self.on_ringing_callback(caller_identity)
def on_telephone_call_established(self, caller_identity: RNS.Identity):
# Update start time to when it was actually established for duration calculation
self.call_start_time = time.time()
+ self.call_was_established = True
# Recording disabled for now due to stability issues with LXST
# if self.config_manager and self.config_manager.call_recording_enabled.get():
@@ -139,9 +145,19 @@ class TelephoneManager:
# Disabled for now
pass
- def announce(self, attached_interface=None):
+ def announce(self, attached_interface=None, display_name=None):
if self.telephone:
- self.telephone.announce(attached_interface=attached_interface)
+ if display_name:
+ import RNS.vendor.umsgpack as msgpack
+
+ # Pack display name in LXMF-compatible app data format
+ app_data = msgpack.packb([display_name, None, None])
+ self.telephone.destination.announce(
+ app_data=app_data, attached_interface=attached_interface
+ )
+ self.telephone.last_announce = time.time()
+ else:
+ self.telephone.announce(attached_interface=attached_interface)
def _update_initiation_status(self, status, target_hash=None):
self.initiation_status = status
@@ -171,15 +187,36 @@ class TelephoneManager:
self._update_initiation_status("Resolving identity...", destination_hash_hex)
try:
- # Find destination identity
- destination_identity = RNS.Identity.recall(destination_hash)
- # If identity not found, check if it's a destination hash in our announces
- if destination_identity is None and self.db:
- announce = self.db.announces.get_announce_by_hash(destination_hash_hex)
- if announce:
- identity_hash = bytes.fromhex(announce["identity_hash"])
- destination_identity = RNS.Identity.recall(identity_hash)
+ def resolve_identity(target_hash_hex):
+ target_hash = bytes.fromhex(target_hash_hex)
+ # 1. Try RNS recall
+ ident = RNS.Identity.recall(target_hash)
+ if ident:
+ return ident
+
+ # 2. Check DB announces
+ if self.db:
+ announce = self.db.announces.get_announce_by_hash(target_hash_hex)
+ if announce:
+ # Try recalling identity hash from announce
+ identity_hash = bytes.fromhex(announce["identity_hash"])
+ ident = RNS.Identity.recall(identity_hash)
+ if ident:
+ return ident
+
+ # Try reconstructing from public key if recall failed
+ if announce.get("identity_public_key"):
+ try:
+ return RNS.Identity.from_bytes(
+ base64.b64decode(announce["identity_public_key"])
+ )
+ except Exception:
+ pass
+ return None
+
+ # Find destination identity
+ destination_identity = resolve_identity(destination_hash_hex)
if destination_identity is None:
self._update_initiation_status("Discovering path/identity...")
@@ -189,20 +226,10 @@ class TelephoneManager:
start_wait = time.time()
while time.time() - start_wait < timeout_seconds:
await asyncio.sleep(0.5)
- destination_identity = RNS.Identity.recall(destination_hash)
+ destination_identity = resolve_identity(destination_hash_hex)
if destination_identity:
break
- if self.db:
- announce = self.db.announces.get_announce_by_hash(
- destination_hash_hex
- )
- if announce:
- identity_hash = bytes.fromhex(announce["identity_hash"])
- destination_identity = RNS.Identity.recall(identity_hash)
- if destination_identity:
- break
-
if destination_identity is None:
self._update_initiation_status(None, None)
msg = "Destination identity not found"
@@ -212,6 +239,13 @@ class TelephoneManager:
self._update_initiation_status("Requesting path...")
RNS.Transport.request_path(destination_hash)
+ # Wait up to 10s for path discovery
+ path_wait_start = time.time()
+ while time.time() - path_wait_start < min(timeout_seconds, 10):
+ if RNS.Transport.has_path(destination_hash):
+ break
+ await asyncio.sleep(0.5)
+
self._update_initiation_status("Dialing...")
self.call_start_time = time.time()
self.call_is_incoming = False
diff --git a/meshchatx/src/backend/voicemail_manager.py b/meshchatx/src/backend/voicemail_manager.py
index 47e4f449..591b9d19 100644
--- a/meshchatx/src/backend/voicemail_manager.py
+++ b/meshchatx/src/backend/voicemail_manager.py
@@ -402,9 +402,6 @@ class VoicemailManager:
threading.Thread(target=session_job, daemon=True).start()
def start_recording(self, caller_identity):
- # Disabled for now
- return
-
telephone = self.telephone_manager.telephone
if not telephone or not telephone.active_call:
return
@@ -454,6 +451,9 @@ class VoicemailManager:
# Save to database if long enough
if duration >= 1:
+ filepath = os.path.join(self.recordings_dir, self.recording_filename)
+ self._fix_recording(filepath)
+
remote_name = self.get_name_for_identity_hash(
self.recording_remote_identity.hash.hex(),
)
@@ -491,10 +491,51 @@ class VoicemailManager:
RNS.log(f"Error stopping recording: {e}", RNS.LOG_ERROR)
self.is_recording = False
- def start_greeting_recording(self):
- # Disabled for now
- return
+ def _fix_recording(self, filepath):
+ """Ensures the recording is a valid OGG/Opus file using ffmpeg."""
+ if not self.has_ffmpeg or not os.path.exists(filepath):
+ return
+
+ temp_path = filepath + ".fix"
+ try:
+ # We assume it might be raw opus packets or a slightly broken ogg
+ # ffmpeg can often fix this by just re-wrapping it.
+ # We try to detect if it's already a valid format first.
+ cmd = [
+ self.ffmpeg_path,
+ "-y",
+ "-i",
+ filepath,
+ "-c:a",
+ "libopus",
+ "-b:a",
+ "16k",
+ "-ar",
+ "48000",
+ "-ac",
+ "1",
+ temp_path,
+ ]
+ result = subprocess.run(
+ cmd, capture_output=True, text=True, check=False
+ ) # noqa: S603
+
+ if result.returncode == 0 and os.path.exists(temp_path):
+ os.remove(filepath)
+ os.rename(temp_path, filepath)
+ RNS.log(f"Voicemail: Fixed recording format for {filepath}", RNS.LOG_DEBUG)
+ else:
+ RNS.log(
+ f"Voicemail: ffmpeg failed to fix {filepath}: {result.stderr}",
+ RNS.LOG_WARNING,
+ )
+ except Exception as e:
+ RNS.log(f"Voicemail: Error fixing recording {filepath}: {e}", RNS.LOG_ERROR)
+ finally:
+ if os.path.exists(temp_path):
+ os.remove(temp_path)
+ def start_greeting_recording(self):
telephone = self.telephone_manager.telephone
if not telephone:
return
diff --git a/meshchatx/src/frontend/components/App.vue b/meshchatx/src/frontend/components/App.vue
index 1eb77ed3..b7c71492 100644
--- a/meshchatx/src/frontend/components/App.vue
+++ b/meshchatx/src/frontend/components/App.vue
@@ -50,7 +50,7 @@
{{ $t("app.custom_fork_by") }}
<a
target="_blank"
- href="https://github.com/Sudo-Ivan"
+ href="https://git.quad4.io/Sudo-Ivan"
class="text-blue-500 dark:text-blue-300 hover:underline"
>Sudo-Ivan</a
>
diff --git a/meshchatx/src/frontend/components/call/CallOverlay.vue b/meshchatx/src/frontend/components/call/CallOverlay.vue
index 537ef2d2..1e07e9b4 100644
--- a/meshchatx/src/frontend/components/call/CallOverlay.vue
+++ b/meshchatx/src/frontend/components/call/CallOverlay.vue
@@ -112,7 +112,7 @@
? 'text-red-600 dark:text-red-400 animate-pulse'
: activeCall.is_voicemail
? 'text-red-600 dark:text-red-400 animate-pulse'
- : activeCall.status === 6
+ : activeCall && activeCall.status === 6
? 'text-green-600 dark:text-green-400'
: 'text-gray-600 dark:text-zinc-400',
]"
@@ -123,17 +123,17 @@
<MaterialDesignIcon icon-name="record" class="size-4" />
{{ $t("call.recording_voicemail") }}
</span>
- <span v-else-if="activeCall.is_incoming && activeCall.status === 4">{{
+ <span v-else-if="activeCall && activeCall.is_incoming && activeCall.status === 4">{{
$t("call.incoming_call")
}}</span>
- <span v-else-if="activeCall.status === 0">{{ $t("call.busy") }}</span>
- <span v-else-if="activeCall.status === 1">{{ $t("call.rejected") }}</span>
- <span v-else-if="activeCall.status === 2">{{ $t("call.calling") }}</span>
- <span v-else-if="activeCall.status === 3">{{ $t("call.available") }}</span>
- <span v-else-if="activeCall.status === 4">{{ $t("call.ringing") }}</span>
- <span v-else-if="activeCall.status === 5">{{ $t("call.connecting") }}</span>
- <span v-else-if="activeCall.status === 6">{{ $t("call.connected") }}</span>
- <span v-else>{{ $t("call.status") }}: {{ activeCall.status }}</span>
+ <span v-else-if="activeCall && activeCall.status === 0">{{ $t("call.busy") }}</span>
+ <span v-else-if="activeCall && activeCall.status === 1">{{ $t("call.rejected") }}</span>
+ <span v-else-if="activeCall && activeCall.status === 2">{{ $t("call.calling") }}</span>
+ <span v-else-if="activeCall && activeCall.status === 3">{{ $t("call.available") }}</span>
+ <span v-else-if="activeCall && activeCall.status === 4">{{ $t("call.ringing") }}</span>
+ <span v-else-if="activeCall && activeCall.status === 5">{{ $t("call.connecting") }}</span>
+ <span v-else-if="activeCall && activeCall.status === 6">{{ $t("call.connected") }}</span>
+ <span v-else-if="activeCall">{{ $t("call.status") }}: {{ activeCall.status }}</span>
</div>
<div
v-else-if="initiationStatus"
@@ -154,7 +154,7 @@
<!-- Stats (only when connected and not minimized) -->
<div
- v-if="activeCall.status === 6 && !isEnded"
+ v-if="activeCall && activeCall.status === 6 && !isEnded"
class="mb-4 p-2 bg-gray-50 dark:bg-zinc-800/50 rounded-lg text-[10px] text-gray-500 dark:text-zinc-400 grid grid-cols-2 gap-1"
>
<div class="flex items-center space-x-1">
@@ -203,7 +203,7 @@
<button
type="button"
:title="
- activeCall.is_incoming && activeCall.status === 4
+ activeCall && activeCall.is_incoming && activeCall.status === 4
? $t('call.decline_call')
: $t('call.hangup_call')
"
@@ -215,7 +215,7 @@
<!-- Send to Voicemail (if incoming) -->
<button
- v-if="activeCall.is_incoming && activeCall.status === 4"
+ v-if="activeCall && activeCall.is_incoming && activeCall.status === 4"
type="button"
:title="$t('call.send_to_voicemail')"
class="p-2.5 rounded-full bg-blue-600 text-white hover:bg-blue-700 shadow-lg shadow-blue-600/30 transition-all duration-200"
@@ -226,7 +226,7 @@
<!-- Answer (if incoming) -->
<button
- v-if="activeCall.is_incoming && activeCall.status === 4"
+ v-if="activeCall && activeCall.is_incoming && activeCall.status === 4"
type="button"
:title="$t('call.answer_call')"
class="p-2.5 rounded-full bg-green-600 text-white hover:bg-green-700 shadow-lg shadow-green-600/30 animate-bounce"
@@ -239,7 +239,7 @@
<!-- Ended State Voicemail Playback -->
<div
- v-if="isEnded && activeCall.is_voicemail && voicemailStatus && voicemailStatus.latest_id"
+ v-if="isEnded && activeCall && activeCall.is_voicemail && voicemailStatus && voicemailStatus.latest_id"
class="px-4 pb-4"
>
<AudioWaveformPlayer :src="`/api/v1/telephone/voicemails/${voicemailStatus.latest_id}/audio`" />
diff --git a/meshchatx/src/frontend/components/call/CallPage.vue b/meshchatx/src/frontend/components/call/CallPage.vue
index acfa7bb8..7ec0418b 100644
--- a/meshchatx/src/frontend/components/call/CallPage.vue
+++ b/meshchatx/src/frontend/components/call/CallPage.vue
@@ -191,7 +191,7 @@
{{ $t("call.recording_voicemail") }}
</span>
<span
- v-else-if="activeCall.is_incoming && activeCall.status === 4"
+ v-else-if="activeCall && activeCall.is_incoming && activeCall.status === 4"
class="text-blue-600 dark:text-blue-400 font-bold text-sm animate-bounce"
>{{ $t("call.incoming_call") }}</span
>
@@ -199,31 +199,31 @@
v-else
class="text-gray-700 dark:text-zinc-300 font-bold text-sm flex items-center gap-2"
>
- <span v-if="activeCall.status === 0">Busy...</span>
- <span v-else-if="activeCall.status === 1" class="text-red-500"
+ <span v-if="activeCall && activeCall.status === 0">Busy...</span>
+ <span v-else-if="activeCall && activeCall.status === 1" class="text-red-500"
>Rejected</span
>
- <span v-else-if="activeCall.status === 2" class="animate-pulse"
+ <span v-else-if="activeCall && activeCall.status === 2" class="animate-pulse"
>Calling...</span
>
- <span v-else-if="activeCall.status === 3">Available</span>
- <span v-else-if="activeCall.status === 4" class="animate-pulse"
+ <span v-else-if="activeCall && activeCall.status === 3">Available</span>
+ <span v-else-if="activeCall && activeCall.status === 4" class="animate-pulse"
>Ringing...</span
>
- <span v-else-if="activeCall.status === 5">Connecting...</span>
+ <span v-else-if="activeCall && activeCall.status === 5">Connecting...</span>
<span
- v-else-if="activeCall.status === 6"
+ v-else-if="activeCall && activeCall.status === 6"
class="text-green-500 flex items-center gap-2"
>
<span class="size-2 bg-green-500 rounded-full animate-ping"></span>
Connected
</span>
- <span v-else>Status: {{ activeCall.status }}</span>
+ <span v-else-if="activeCall">Status: {{ activeCall.status }}</span>
</span>
<!-- Duration -->
<div
- v-if="activeCall.status === 6 && elapsedTime"
+ v-if="activeCall && activeCall.status === 6 && elapsedTime"
class="text-xs font-mono text-gray-400 dark:text-zinc-500 mt-1"
>
{{ elapsedTime }}
@@ -336,7 +336,7 @@
<div class="flex gap-3">
<!-- answer call -->
<button
- v-if="activeCall.is_incoming && activeCall.status === 4"
+ v-if="activeCall && activeCall.is_incoming && activeCall.status === 4"
type="button"
class="flex-1 flex items-center justify-center gap-2 rounded-2xl bg-green-600 py-4 text-sm font-bold text-white shadow-xl shadow-green-600/20 hover:bg-green-500 transition-all duration-200"
@click="answerCall"
@@ -347,7 +347,7 @@
<!-- send to voicemail -->
<button
- v-if="activeCall.is_incoming && activeCall.status === 4"
+ v-if="activeCall && activeCall.is_incoming && activeCall.status === 4"
type="button"
class="flex-1 flex items-center justify-center gap-2 rounded-2xl bg-blue-600 py-4 text-sm font-bold text-white shadow-xl shadow-blue-600/20 hover:bg-blue-500 transition-all duration-200"
@click="sendToVoicemail"
@@ -365,7 +365,7 @@
>
<MaterialDesignIcon icon-name="phone-hangup" class="size-5 rotate-[135deg]" />
<span>{{
- activeCall.is_incoming && activeCall.status === 4
+ activeCall && activeCall.is_incoming && activeCall.status === 4
? $t("call.decline")
: $t("call.hangup")
}}</span>
diff --git a/meshchatx/src/frontend/components/docs/DocsPage.vue b/meshchatx/src/frontend/components/docs/DocsPage.vue
index 20e9e5e5..c5af436d 100644
--- a/meshchatx/src/frontend/components/docs/DocsPage.vue
+++ b/meshchatx/src/frontend/components/docs/DocsPage.vue
@@ -85,6 +85,71 @@
<!-- Actions Section -->
<div class="flex items-center space-x-1 md:space-x-2 ml-auto shrink-0">
+ <!-- Version Selector -->
+ <div
+ v-if="activeTab === 'reticulum' && (status.has_docs || status.versions.length > 0)"
+ class="relative"
+ >
+ <button
+ v-click-outside="() => (showVersions = false)"
+ class="p-1.5 text-gray-500 hover:bg-gray-100 dark:hover:bg-zinc-800 rounded-lg transition-colors flex items-center gap-1.5"
+ :class="{ 'bg-gray-100 dark:bg-zinc-800': showVersions }"
+ @click="showVersions = !showVersions"
+ >
+ <MaterialDesignIcon icon-name="history" class="w-4 h-4 md:w-5 md:h-5" />
+ <span class="hidden xl:inline text-[10px] font-bold uppercase">{{
+ status.current_version || "Default"
+ }}</span>
+ </button>
+ <div
+ v-if="showVersions"
+ class="absolute right-0 mt-2 w-48 bg-white dark:bg-zinc-800 border border-gray-200 dark:border-zinc-700 rounded-xl shadow-xl z-50 overflow-hidden"
+ >
+ <div
+ class="p-2 border-b border-gray-100 dark:border-zinc-700 bg-gray-50/50 dark:bg-zinc-800/50"
+ >
+ <span class="text-[10px] font-bold text-gray-400 uppercase tracking-wider">Versions</span>
+ </div>
+ <div class="max-h-64 overflow-y-auto py-1">
+ <button
+ v-for="version in status.versions"
+ :key="version"
+ class="w-full px-4 py-2 text-left text-[11px] hover:bg-blue-50 dark:hover:bg-blue-900/20 transition-colors flex items-center justify-between"
+ :class="
+ status.current_version === version
+ ? 'text-blue-600 dark:text-blue-400 font-bold'
+ : 'text-gray-700 dark:text-zinc-300'
+ "
+ @click="switchVersion(version)"
+ >
+ <span>{{ version }}</span>
+ <MaterialDesignIcon
+ v-if="status.current_version === version"
+ icon-name="check"
+ class="w-3.5 h-3.5"
+ />
+ </button>
+ <div
+ v-if="status.versions.length === 0"
+ class="px-4 py-3 text-center text-gray-500 text-[10px]"
+ >
+ No versions available
+ </div>
+ </div>
+ <div
+ class="p-2 border-t border-gray-100 dark:border-zinc-700 bg-gray-50/50 dark:bg-zinc-800/50"
+ >
+ <label
+ class="flex items-center justify-center gap-2 px-3 py-1.5 bg-blue-600 hover:bg-blue-700 text-white rounded-lg cursor-pointer transition-colors text-[10px] font-bold uppercase"
+ >
+ <MaterialDesignIcon icon-name="upload" class="w-3.5 h-3.5" />
+ <span>Upload ZIP</span>
+ <input type="file" accept=".zip" class="hidden" @change="handleZipUpload" />
+ </label>
+ </div>
+ </div>
+ </div>
+
<!-- Language Selector -->
<div v-if="activeTab === 'reticulum' && status.has_docs" class="relative">
<button
@@ -456,9 +521,12 @@ export default {
last_error: null,
has_docs: false,
has_meshchatx_docs: false,
+ versions: [],
+ current_version: null,
},
statusInterval: null,
showLanguages: false,
+ showVersions: false,
searchQuery: "",
searchResults: [],
isSearching: false,
@@ -568,6 +636,44 @@ export default {
console.error("Failed to trigger docs update:", error);
}
},
+ async switchVersion(version) {
+ try {
+ await window.axios.post("/api/v1/docs/switch", { version });
+ this.showVersions = false;
+ this.fetchStatus();
+ // reload iframe if in reticulum tab
+ if (this.activeTab === "reticulum") {
+ const iframe = this.$refs.docsIframe;
+ if (iframe) {
+ iframe.contentWindow.location.reload();
+ }
+ }
+ } catch (error) {
+ console.error("Failed to switch docs version:", error);
+ }
+ },
+ async handleZipUpload(event) {
+ const file = event.target.files[0];
+ if (!file) return;
+
+ const version = prompt("Enter version name for this upload:", `upload-${Date.now()}`);
+ if (!version) return;
+
+ const formData = new FormData();
+ formData.append("file", file);
+
+ try {
+ await window.axios.post(`/api/v1/docs/upload?version=${encodeURIComponent(version)}`, formData, {
+ headers: {
+ "Content-Type": "multipart/form-data",
+ },
+ });
+ this.fetchStatus();
+ } catch (error) {
+ console.error("Failed to upload docs zip:", error);
+ alert("Failed to upload docs zip: " + (error.response?.data?.error || error.message));
+ }
+ },
async exportDocs() {
window.location.href = "/api/v1/docs/export";
},
diff --git a/meshchatx/src/frontend/components/messages/AudioWaveformPlayer.vue b/meshchatx/src/frontend/components/messages/AudioWaveformPlayer.vue
index d6cd0e41..b41e4ee3 100644
--- a/meshchatx/src/frontend/components/messages/AudioWaveformPlayer.vue
+++ b/meshchatx/src/frontend/components/messages/AudioWaveformPlayer.vue
@@ -108,6 +108,9 @@ export default {
this.stopPlayback();
const response = await fetch(this.src);
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
const arrayBuffer = await response.arrayBuffer();
if (!this.audioContext) {
diff --git a/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue b/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue
index 3d6464e3..2f949738 100644
--- a/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue
+++ b/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue
@@ -15,7 +15,7 @@
{{ $t("tools.micron_editor.title") }}
</h1>
<a
- href="https://github.com/RFnexus"
+ href="https://git.quad4.io/RFnexus"
target="_blank"
rel="noopener noreferrer"
class="text-[10px] text-gray-500 hover:text-teal-500 transition-colors hidden sm:block leading-tight"
diff --git a/meshchatx/src/frontend/components/tools/RNodeFlasherPage.vue b/meshchatx/src/frontend/components/tools/RNodeFlasherPage.vue
index eaf4eb14..cf9c10a0 100644
--- a/meshchatx/src/frontend/components/tools/RNodeFlasherPage.vue
+++ b/meshchatx/src/frontend/components/tools/RNodeFlasherPage.vue
@@ -396,13 +396,13 @@
<div class="flex items-center gap-4">
<a
target="_blank"
- href="https://github.com/liamcottle/rnode-flasher"
+ href="https://git.quad4.io/Reticulum/rnode-flasher"
class="text-blue-500 hover:underline text-sm font-bold"
>RNode Flasher GH</a
>
<a
target="_blank"
- href="https://github.com/markqvist/RNode_Firmware"
+ href="https://git.quad4.io/Reticulum/RNode_Firmware"
class="text-blue-500 hover:underline text-sm font-bold"
>RNode Firmware GH</a
>
@@ -472,7 +472,9 @@ export default {
methods: {
async fetchLatestRelease() {
try {
- const response = await fetch("https://api.github.com/repos/markqvist/RNode_Firmware/releases/latest");
+ const response = await fetch(
+ "https://git.quad4.io/api/v1/repos/Reticulum/RNode_Firmware/releases/latest"
+ );
if (response.ok) {
this.latestRelease = await response.json();
}
@@ -726,6 +728,7 @@ export default {
terminal: {
writeLine: console.log,
write: console.log,
+ clean: () => {},
},
});
@@ -738,7 +741,11 @@ export default {
calculateMD5Hash: (img) => window.CryptoJS.MD5(window.CryptoJS.enc.Latin1.parse(img)),
reportProgress: (idx, written, total) => {
this.flashingProgress = Math.floor((written / total) * 100);
- this.flashingStatus = `File ${idx + 1}/${filesToFlash.length}: ${this.flashingProgress}%`;
+ this.flashingStatus = this.$t("tools.rnode_flasher.flashing_file_progress", {
+ current: idx + 1,
+ total: filesToFlash.length,
+ percentage: this.flashingProgress,
+ });
},
});
@@ -762,7 +769,7 @@ export default {
const rnode = await this.askForRNode();
if (!rnode) return;
const ver = await rnode.getFirmwareVersion();
- ToastUtils.success(`RNode v${ver} detected`);
+ ToastUtils.success(this.$t("tools.rnode_flasher.alerts.rnode_detected", { version: ver }));
await rnode.close();
} catch {
ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_detect"));
@@ -775,8 +782,8 @@ export default {
await rnode.reset();
await rnode.close();
ToastUtils.success(this.$t("tools.rnode_flasher.alerts.rebooting"));
- } catch {
- // ignore
+ } catch (e) {
+ ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_reboot", { error: e.message || e }));
}
},
async readDisplay() {
@@ -786,8 +793,8 @@ export default {
const buffer = await rnode.readDisplay();
await rnode.close();
this.rnodeDisplayImage = this.rnodeDisplayBufferToPng(buffer);
- } catch {
- // ignore
+ } catch (e) {
+ ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_read_display", { error: e.message || e }));
}
},
rnodeDisplayBufferToPng(displayBuffer) {
@@ -837,9 +844,9 @@ export default {
const eeprom = await rnode.getRom();
console.log(RNodeUtils.bytesToHex(eeprom));
await rnode.close();
- ToastUtils.success("EEPROM dumped to console");
- } catch {
- // ignore
+ ToastUtils.success(this.$t("tools.rnode_flasher.alerts.eeprom_dumped"));
+ } catch (e) {
+ ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_dump_eeprom", { error: e.message || e }));
}
},
async wipeEeprom() {
@@ -854,8 +861,8 @@ export default {
await rnode.reset();
await rnode.close();
ToastUtils.success(this.$t("tools.rnode_flasher.alerts.eeprom_wiped"));
- } catch {
- // ignore
+ } catch (e) {
+ ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_wipe_eeprom", { error: e.message || e }));
}
},
async provision() {
@@ -904,8 +911,8 @@ export default {
await rnode.reset();
await rnode.close();
ToastUtils.success(this.$t("tools.rnode_flasher.alerts.provision_success"));
- } catch {
- ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_provision"));
+ } catch (e) {
+ ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_provision", { error: e.message || e }));
} finally {
this.isProvisioning = false;
}
@@ -920,7 +927,6 @@ export default {
await rnode.close();
return;
}
-
this.isSettingFirmwareHash = true;
const hash = await rnode.getFirmwareHash();
await rnode.setFirmwareHash(hash);
@@ -930,8 +936,8 @@ export default {
});
await rnode.close();
ToastUtils.success(this.$t("tools.rnode_flasher.alerts.hash_success"));
- } catch {
- ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_set_hash"));
+ } catch (e) {
+ ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_set_hash", { error: e.message || e }));
} finally {
this.isSettingFirmwareHash = false;
}
@@ -953,8 +959,8 @@ export default {
await rnode.reset();
await rnode.close();
ToastUtils.success(this.$t("tools.rnode_flasher.alerts.tnc_enabled"));
- } catch {
- // ignore
+ } catch (e) {
+ ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_enable_tnc", { error: e.message || e }));
}
},
async disableTncMode() {
@@ -966,8 +972,8 @@ export default {
await rnode.reset();
await rnode.close();
ToastUtils.success(this.$t("tools.rnode_flasher.alerts.tnc_disabled"));
- } catch {
- // ignore
+ } catch (e) {
+ ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_disable_tnc", { error: e.message || e }));
}
},
async enableBluetooth() {
@@ -978,8 +984,10 @@ export default {
await RNodeUtils.sleepMillis(1000);
await rnode.close();
ToastUtils.success(this.$t("tools.rnode_flasher.alerts.bluetooth_enabled"));
- } catch {
- // ignore
+ } catch (e) {
+ ToastUtils.error(
+ this.$t("tools.rnode_flasher.errors.failed_enable_bluetooth", { error: e.message || e })
+ );
}
},
async disableBluetooth() {
@@ -990,8 +998,10 @@ export default {
await RNodeUtils.sleepMillis(1000);
await rnode.close();
ToastUtils.success(this.$t("tools.rnode_flasher.alerts.bluetooth_disabled"));
- } catch {
- // ignore
+ } catch (e) {
+ ToastUtils.error(
+ this.$t("tools.rnode_flasher.errors.failed_disable_bluetooth", { error: e.message || e })
+ );
}
},
async startBluetoothPairing() {
@@ -1001,9 +1011,9 @@ export default {
await rnode.startBluetoothPairing((pin) => {
ToastUtils.success(this.$t("tools.rnode_flasher.alerts.bluetooth_pairing_pin", { pin }));
});
- ToastUtils.success("Pairing mode started (30s)");
- } catch {
- // ignore
+ ToastUtils.success(this.$t("tools.rnode_flasher.alerts.bluetooth_pairing_started"));
+ } catch (e) {
+ ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_start_pairing", { error: e.message || e }));
}
},
async setDisplayRotation(rot) {
@@ -1012,9 +1022,9 @@ export default {
if (!rnode) return;
await rnode.setDisplayRotation(rot);
await rnode.close();
- ToastUtils.success("Rotation updated");
- } catch {
- // ignore
+ ToastUtils.success(this.$t("tools.rnode_flasher.alerts.rotation_updated"));
+ } catch (e) {
+ ToastUtils.error(this.$t("tools.rnode_flasher.errors.failed_set_rotation", { error: e.message || e }));
}
},
async startDisplayReconditioning() {
@@ -1023,9 +1033,11 @@ export default {
if (!rnode) return;
await rnode.startDisplayReconditioning();
await rnode.close();
- ToastUtils.success("Reconditioning started");
- } catch {
- // ignore
+ ToastUtils.success(this.$t("tools.rnode_flasher.alerts.reconditioning_started"));
+ } catch (e) {
+ ToastUtils.error(
+ this.$t("tools.rnode_flasher.errors.failed_start_reconditioning", { error: e.message || e })
+ );
}
},
async readAsBinaryString(blob) {
diff --git a/meshchatx/src/frontend/js/WebSocketConnection.js b/meshchatx/src/frontend/js/WebSocketConnection.js
index 78169a4e..1d121af9 100644
--- a/meshchatx/src/frontend/js/WebSocketConnection.js
+++ b/meshchatx/src/frontend/js/WebSocketConnection.js
@@ -5,11 +5,15 @@ class WebSocketConnection {
this.emitter = mitt();
this.ws = null;
this.pingInterval = null;
+ this.reconnectTimeout = null;
this.initialized = false;
+ this.destroyed = false;
this.connect();
}
async connect() {
+ this.destroyed = false;
+
if (typeof window === "undefined" || !window.axios) {
setTimeout(() => this.connect(), 100);
return;
@@ -17,6 +21,7 @@ class WebSocketConnection {
this.initialized = true;
this.reconnect();
+ if (this.pingInterval) clearInterval(this.pingInterval);
this.pingInterval = setInterval(() => {
this.ping();
}, 30000);
@@ -38,17 +43,18 @@ class WebSocketConnection {
}
reconnect() {
- if (!this.initialized) {
+ if (!this.initialized || this.destroyed || typeof window === "undefined" || !window.location) {
return;
}
// connect to websocket
- const wsUrl = location.origin.replace(/^https/, "wss").replace(/^http/, "ws") + "/ws";
+ const wsUrl = window.location.origin.replace(/^https/, "wss").replace(/^http/, "ws") + "/ws";
this.ws = new WebSocket(wsUrl);
// auto reconnect when websocket closes
this.ws.addEventListener("close", () => {
- setTimeout(() => {
+ if (this.destroyed) return;
+ this.reconnectTimeout = setTimeout(() => {
this.reconnect();
}, 1000);
});
@@ -59,6 +65,23 @@ class WebSocketConnection {
};
}
+ destroy() {
+ this.destroyed = true;
+ this.initialized = false;
+ if (this.pingInterval) {
+ clearInterval(this.pingInterval);
+ this.pingInterval = null;
+ }
+ if (this.reconnectTimeout) {
+ clearTimeout(this.reconnectTimeout);
+ this.reconnectTimeout = null;
+ }
+ if (this.ws) {
+ this.ws.close();
+ this.ws = null;
+ }
+ }
+
send(message) {
if (this.ws != null && this.ws.readyState === WebSocket.OPEN) {
this.ws.send(message);
diff --git a/meshchatx/src/frontend/js/rnode/Nrf52DfuFlasher.js b/meshchatx/src/frontend/js/rnode/Nrf52DfuFlasher.js
new file mode 100644
index 00000000..a2672cf6
--- /dev/null
+++ b/meshchatx/src/frontend/js/rnode/Nrf52DfuFlasher.js
@@ -0,0 +1,263 @@
+export default class Nrf52DfuFlasher {
+ DFU_TOUCH_BAUD = 1200;
+ SERIAL_PORT_OPEN_WAIT_TIME = 0.1;
+ TOUCH_RESET_WAIT_TIME = 1.5;
+
+ FLASH_BAUD = 115200;
+
+ HEX_TYPE_APPLICATION = 4;
+
+ DFU_INIT_PACKET = 1;
+ DFU_START_PACKET = 3;
+ DFU_DATA_PACKET = 4;
+ DFU_STOP_DATA_PACKET = 5;
+
+ DATA_INTEGRITY_CHECK_PRESENT = 1;
+ RELIABLE_PACKET = 1;
+ HCI_PACKET_TYPE = 14;
+
+ FLASH_PAGE_SIZE = 4096;
+ FLASH_PAGE_ERASE_TIME = 0.0897;
+ FLASH_WORD_WRITE_TIME = 0.0001;
+ FLASH_PAGE_WRITE_TIME = (this.FLASH_PAGE_SIZE / 4) * this.FLASH_WORD_WRITE_TIME;
+
+ // The DFU packet max size
+ DFU_PACKET_MAX_SIZE = 512;
+
+ constructor(serialPort) {
+ this.serialPort = serialPort;
+ this.sequenceNumber = 0;
+ this.sd_size = 0;
+ this.total_size = 0;
+ }
+
+ /**
+ * Waits for the provided milliseconds, and then resolves.
+ * @param millis
+ * @returns {Promise<void>}
+ */
+ async sleepMillis(millis) {
+ await new Promise((resolve) => {
+ setTimeout(resolve, millis);
+ });
+ }
+
+ /**
+ * Writes the provided data to the Serial Port.
+ * @param data
+ * @returns {Promise<void>}
+ */
+ async sendPacket(data) {
+ const writer = this.serialPort.writable.getWriter();
+ try {
+ await writer.write(new Uint8Array(data));
+ } finally {
+ writer.releaseLock();
+ }
+ }
+
+ /**
+ * Puts an nRF52 board into DFU mode by quickly opening and closing a serial port.
+ * @returns {Promise<void>}
+ */
+ async enterDfuMode() {
+ await this.serialPort.open({
+ baudRate: this.DFU_TOUCH_BAUD,
+ });
+
+ await this.sleepMillis(this.SERIAL_PORT_OPEN_WAIT_TIME * 1000);
+ await this.serialPort.close();
+ await this.sleepMillis(this.TOUCH_RESET_WAIT_TIME * 1000);
+ }
+
+ /**
+ * Flashes the provided firmware zip.
+ * @param firmwareZipBlob
+ * @param progressCallback
+ * @returns {Promise<void>}
+ */
+ async flash(firmwareZipBlob, progressCallback) {
+ const blobReader = new window.zip.BlobReader(firmwareZipBlob);
+ const zipReader = new window.zip.ZipReader(blobReader);
+ const zipEntries = await zipReader.getEntries();
+
+ const manifestFile = zipEntries.find((zipEntry) => zipEntry.filename === "manifest.json");
+ if (!manifestFile) {
+ throw new Error("manifest.json not found in firmware file!");
+ }
+
+ const text = await manifestFile.getData(new window.zip.TextWriter());
+ const json = JSON.parse(text);
+ const manifest = json.manifest;
+
+ if (manifest.application) {
+ await this.dfuSendImage(this.HEX_TYPE_APPLICATION, zipEntries, manifest.application, progressCallback);
+ }
+ }
+
+ /**
+ * Sends the firmware image to the device in DFU mode.
+ * @param programMode
+ * @param zipEntries
+ * @param firmwareManifest
+ * @param progressCallback
+ * @returns {Promise<void>}
+ */
+ async dfuSendImage(programMode, zipEntries, firmwareManifest, progressCallback) {
+ await this.serialPort.open({
+ baudRate: this.FLASH_BAUD,
+ });
+
+ await this.sleepMillis(this.SERIAL_PORT_OPEN_WAIT_TIME * 1000);
+
+ var softdeviceSize = 0;
+ var bootloaderSize = 0;
+ var applicationSize = 0;
+
+ const binFile = zipEntries.find((zipEntry) => zipEntry.filename === firmwareManifest.bin_file);
+ const firmware = await binFile.getData(new window.zip.Uint8ArrayWriter());
+
+ const datFile = zipEntries.find((zipEntry) => zipEntry.filename === firmwareManifest.dat_file);
+ const init_packet = await datFile.getData(new window.zip.Uint8ArrayWriter());
+
+ if (programMode !== this.HEX_TYPE_APPLICATION) {
+ throw new Error("not implemented");
+ }
+
+ if (programMode === this.HEX_TYPE_APPLICATION) {
+ applicationSize = firmware.length;
+ }
+
+ await this.sendStartDfu(programMode, softdeviceSize, bootloaderSize, applicationSize);
+ await this.sendInitPacket(init_packet);
+ await this.sendFirmware(firmware, progressCallback);
+ }
+
+ calcCrc16(binaryData, crc = 0xffff) {
+ if (!(binaryData instanceof Uint8Array)) {
+ throw new Error("calcCrc16 requires Uint8Array input");
+ }
+
+ for (let b of binaryData) {
+ crc = ((crc >> 8) & 0x00ff) | ((crc << 8) & 0xff00);
+ crc ^= b;
+ crc ^= (crc & 0x00ff) >> 4;
+ crc ^= (crc << 8) << 4;
+ crc ^= ((crc & 0x00ff) << 4) << 1;
+ }
+
+ return crc & 0xffff;
+ }
+
+ slipEncodeEscChars(dataIn) {
+ let result = [];
+ for (let i = 0; i < dataIn.length; i++) {
+ let char = dataIn[i];
+ if (char === 0xc0) {
+ result.push(0xdb);
+ result.push(0xdc);
+ } else if (char === 0xdb) {
+ result.push(0xdb);
+ result.push(0xdd);
+ } else {
+ result.push(char);
+ }
+ }
+ return result;
+ }
+
+ createHciPacketFromFrame(frame) {
+ this.sequenceNumber = (this.sequenceNumber + 1) % 8;
+ const slipHeaderBytes = this.createSlipHeader(
+ this.sequenceNumber,
+ this.DATA_INTEGRITY_CHECK_PRESENT,
+ this.RELIABLE_PACKET,
+ this.HCI_PACKET_TYPE,
+ frame.length
+ );
+
+ let data = [...slipHeaderBytes, ...frame];
+ const crc = this.calcCrc16(new Uint8Array(data), 0xffff);
+ data.push(crc & 0xff);
+ data.push((crc & 0xff00) >> 8);
+
+ return [0xc0, ...this.slipEncodeEscChars(data), 0xc0];
+ }
+
+ getEraseWaitTime() {
+ return Math.max(0.5, (this.total_size / this.FLASH_PAGE_SIZE + 1) * this.FLASH_PAGE_ERASE_TIME);
+ }
+
+ createImageSizePacket(softdeviceSize = 0, bootloaderSize = 0, appSize = 0) {
+ return [
+ ...this.int32ToBytes(softdeviceSize),
+ ...this.int32ToBytes(bootloaderSize),
+ ...this.int32ToBytes(appSize),
+ ];
+ }
+
+ async sendStartDfu(mode, softdevice_size = 0, bootloader_size = 0, app_size = 0) {
+ const frame = [
+ ...this.int32ToBytes(this.DFU_START_PACKET),
+ ...this.int32ToBytes(mode),
+ ...this.createImageSizePacket(softdevice_size, bootloader_size, app_size),
+ ];
+
+ await this.sendPacket(this.createHciPacketFromFrame(frame));
+ this.sd_size = softdevice_size;
+ this.total_size = softdevice_size + bootloader_size + app_size;
+ await this.sleepMillis(this.getEraseWaitTime() * 1000);
+ }
+
+ async sendInitPacket(initPacket) {
+ const frame = [...this.int32ToBytes(this.DFU_INIT_PACKET), ...initPacket, ...this.int16ToBytes(0x0000)];
+ await this.sendPacket(this.createHciPacketFromFrame(frame));
+ }
+
+ async sendFirmware(firmware, progressCallback) {
+ const packets = [];
+ var packetsSent = 0;
+
+ for (let i = 0; i < firmware.length; i += this.DFU_PACKET_MAX_SIZE) {
+ packets.push(
+ this.createHciPacketFromFrame([
+ ...this.int32ToBytes(this.DFU_DATA_PACKET),
+ ...firmware.slice(i, i + this.DFU_PACKET_MAX_SIZE),
+ ])
+ );
+ }
+
+ if (progressCallback) {
+ progressCallback(0);
+ }
+
+ for (var i = 0; i < packets.length; i++) {
+ await this.sendPacket(packets[i]);
+ await this.sleepMillis(this.FLASH_PAGE_WRITE_TIME * 1000);
+ packetsSent++;
+ if (progressCallback) {
+ const progress = Math.floor((packetsSent / packets.length) * 100);
+ progressCallback(progress);
+ }
+ }
+
+ await this.sendPacket(this.createHciPacketFromFrame([...this.int32ToBytes(this.DFU_STOP_DATA_PACKET)]));
+ }
+
+ createSlipHeader(seq, dip, rp, pktType, pktLen) {
+ let ints = [0, 0, 0, 0];
+ ints[0] = seq | (((seq + 1) % 8) << 3) | (dip << 6) | (rp << 7);
+ ints[1] = pktType | ((pktLen & 0x000f) << 4);
+ ints[2] = (pktLen & 0x0ff0) >> 4;
+ ints[3] = (~(ints[0] + ints[1] + ints[2]) + 1) & 0xff;
+ return new Uint8Array(ints);
+ }
+
+ int32ToBytes(num) {
+ return [num & 0x000000ff, (num & 0x0000ff00) >> 8, (num & 0x00ff0000) >> 16, (num & 0xff000000) >> 24];
+ }
+
+ int16ToBytes(num) {
+ return [num & 0x00ff, (num & 0xff00) >> 8];
+ }
+}
diff --git a/meshchatx/src/frontend/js/rnode/RNode.js b/meshchatx/src/frontend/js/rnode/RNode.js
new file mode 100644
index 00000000..c1b29036
--- /dev/null
+++ b/meshchatx/src/frontend/js/rnode/RNode.js
@@ -0,0 +1,461 @@
+import RNodeUtils from "./RNodeUtils.js";
+import ROM from "./ROM.js";
+
+export default class RNode {
+ KISS_FEND = 0xc0;
+ KISS_FESC = 0xdb;
+ KISS_TFEND = 0xdc;
+ KISS_TFESC = 0xdd;
+
+ CMD_FREQUENCY = 0x01;
+ CMD_BANDWIDTH = 0x02;
+ CMD_TXPOWER = 0x03;
+ CMD_SF = 0x04;
+ CMD_CR = 0x05;
+ CMD_RADIO_STATE = 0x06;
+
+ CMD_STAT_RX = 0x21;
+ CMD_STAT_TX = 0x22;
+ CMD_STAT_RSSI = 0x23;
+ CMD_STAT_SNR = 0x24;
+
+ CMD_BOARD = 0x47;
+ CMD_PLATFORM = 0x48;
+ CMD_MCU = 0x49;
+ CMD_RESET = 0x55;
+ CMD_RESET_BYTE = 0xf8;
+ CMD_DEV_HASH = 0x56;
+ CMD_FW_VERSION = 0x50;
+ CMD_ROM_READ = 0x51;
+ CMD_ROM_WRITE = 0x52;
+ CMD_CONF_SAVE = 0x53;
+ CMD_CONF_DELETE = 0x54;
+ CMD_FW_HASH = 0x58;
+ CMD_UNLOCK_ROM = 0x59;
+ ROM_UNLOCK_BYTE = 0xf8;
+ CMD_HASHES = 0x60;
+ CMD_FW_UPD = 0x61;
+ CMD_DISP_ROT = 0x67;
+ CMD_DISP_RCND = 0x68;
+
+ CMD_BT_CTRL = 0x46;
+ CMD_BT_PIN = 0x62;
+
+ CMD_DISP_READ = 0x66;
+
+ CMD_DETECT = 0x08;
+ DETECT_REQ = 0x73;
+ DETECT_RESP = 0x46;
+
+ RADIO_STATE_OFF = 0x00;
+ RADIO_STATE_ON = 0x01;
+ RADIO_STATE_ASK = 0xff;
+
+ CMD_ERROR = 0x90;
+ ERROR_INITRADIO = 0x01;
+ ERROR_TXFAILED = 0x02;
+ ERROR_EEPROM_LOCKED = 0x03;
+
+ PLATFORM_AVR = 0x90;
+ PLATFORM_ESP32 = 0x80;
+ PLATFORM_NRF52 = 0x70;
+
+ MCU_1284P = 0x91;
+ MCU_2560 = 0x92;
+ MCU_ESP32 = 0x81;
+ MCU_NRF52 = 0x71;
+
+ BOARD_RNODE = 0x31;
+ BOARD_HMBRW = 0x32;
+ BOARD_TBEAM = 0x33;
+ BOARD_HUZZAH32 = 0x34;
+ BOARD_GENERIC_ESP32 = 0x35;
+ BOARD_LORA32_V2_0 = 0x36;
+ BOARD_LORA32_V2_1 = 0x37;
+ BOARD_RAK4631 = 0x51;
+
+ HASH_TYPE_TARGET_FIRMWARE = 0x01;
+ HASH_TYPE_FIRMWARE = 0x02;
+
+ constructor(serialPort) {
+ this.serialPort = serialPort;
+ this.reader = serialPort.readable.getReader();
+ this.writable = serialPort.writable;
+ this.callbacks = {};
+ this.readLoop();
+ }
+
+ static async fromSerialPort(serialPort) {
+ await serialPort.open({
+ baudRate: 115200,
+ });
+
+ return new RNode(serialPort);
+ }
+
+ async close() {
+ try {
+ this.reader.releaseLock();
+ } catch {
+ // ignore
+ }
+
+ try {
+ await this.serialPort.close();
+ } catch {
+ // ignore
+ }
+ }
+
+ async write(bytes) {
+ const writer = this.writable.getWriter();
+ try {
+ await writer.write(new Uint8Array(bytes));
+ } finally {
+ writer.releaseLock();
+ }
+ }
+
+ async readLoop() {
+ try {
+ let buffer = [];
+ let inFrame = false;
+ while (true) {
+ const { value, done } = await this.reader.read();
+ if (done) {
+ break;
+ }
+
+ for (const byte of value) {
+ if (byte === this.KISS_FEND) {
+ if (inFrame) {
+ const decodedFrame = this.decodeKissFrame(buffer);
+ if (decodedFrame) {
+ this.onCommandReceived(decodedFrame);
+ } else {
+ console.warn("Invalid frame ignored.");
+ }
+ buffer = [];
+ }
+ inFrame = !inFrame;
+ } else if (inFrame) {
+ buffer.push(byte);
+ }
+ }
+ }
+ } catch (error) {
+ if (error instanceof TypeError) {
+ return;
+ }
+ console.error("Error reading from serial port: ", error);
+ } finally {
+ try {
+ this.reader.releaseLock();
+ } catch {
+ // ignore
+ }
+ }
+ }
+
+ onCommandReceived(data) {
+ try {
+ const [command, ...bytes] = data;
+ const callback = this.callbacks[command];
+ if (!callback) {
+ return;
+ }
+ callback(bytes);
+ delete this.callbacks[command];
+ } catch (e) {
+ console.log("failed to handle received command", data, e);
+ }
+ }
+
+ decodeKissFrame(frame) {
+ const data = [];
+ let escaping = false;
+
+ for (const byte of frame) {
+ if (escaping) {
+ if (byte === this.KISS_TFEND) {
+ data.push(this.KISS_FEND);
+ } else if (byte === this.KISS_TFESC) {
+ data.push(this.KISS_FESC);
+ } else {
+ return null;
+ }
+ escaping = false;
+ } else if (byte === this.KISS_FESC) {
+ escaping = true;
+ } else {
+ data.push(byte);
+ }
+ }
+
+ return escaping ? null : data;
+ }
+
+ createKissFrame(data) {
+ let frame = [this.KISS_FEND];
+ for (let byte of data) {
+ if (byte === this.KISS_FEND) {
+ frame.push(this.KISS_FESC, this.KISS_TFEND);
+ } else if (byte === this.KISS_FESC) {
+ frame.push(this.KISS_FESC, this.KISS_TFESC);
+ } else {
+ frame.push(byte);
+ }
+ }
+ frame.push(this.KISS_FEND);
+ return new Uint8Array(frame);
+ }
+
+ async sendKissCommand(data) {
+ await this.write(this.createKissFrame(data));
+ }
+
+ async sendCommand(command, data) {
+ return new Promise((resolve, reject) => {
+ this.callbacks[command] = (response) => {
+ resolve(response);
+ };
+
+ this.sendKissCommand([command, ...data]).catch((e) => {
+ reject(e);
+ });
+ });
+ }
+
+ async reset() {
+ await this.sendKissCommand([this.CMD_RESET, this.CMD_RESET_BYTE]);
+ }
+
+ async detect() {
+ return new Promise((resolve) => {
+ const timeout = setTimeout(() => {
+ resolve(false);
+ }, 2000);
+
+ this.sendCommand(this.CMD_DETECT, [this.DETECT_REQ])
+ .then((response) => {
+ clearTimeout(timeout);
+ const [responseByte] = response;
+ const isRnode = responseByte === this.DETECT_RESP;
+ resolve(isRnode);
+ })
+ .catch(() => {
+ resolve(false);
+ });
+ });
+ }
+
+ async getFirmwareVersion() {
+ const response = await this.sendCommand(this.CMD_FW_VERSION, [0x00]);
+ var [majorVersion, minorVersion] = response;
+ if (minorVersion.length === 1) {
+ minorVersion = "0" + minorVersion;
+ }
+ return majorVersion + "." + minorVersion;
+ }
+
+ async getPlatform() {
+ const response = await this.sendCommand(this.CMD_PLATFORM, [0x00]);
+ const [platformByte] = response;
+ return platformByte;
+ }
+
+ async getMcu() {
+ const response = await this.sendCommand(this.CMD_MCU, [0x00]);
+ const [mcuByte] = response;
+ return mcuByte;
+ }
+
+ async getBoard() {
+ const response = await this.sendCommand(this.CMD_BOARD, [0x00]);
+ const [boardByte] = response;
+ return boardByte;
+ }
+
+ async getDeviceHash() {
+ const response = await this.sendCommand(this.CMD_DEV_HASH, [0x01]);
+ const [...deviceHash] = response;
+ return deviceHash;
+ }
+
+ async getTargetFirmwareHash() {
+ const response = await this.sendCommand(this.CMD_HASHES, [this.HASH_TYPE_TARGET_FIRMWARE]);
+ const [, ...targetFirmwareHash] = response;
+ return targetFirmwareHash;
+ }
+
+ async getFirmwareHash() {
+ const response = await this.sendCommand(this.CMD_HASHES, [this.HASH_TYPE_FIRMWARE]);
+ const [, ...firmwareHash] = response;
+ return firmwareHash;
+ }
+
+ async getRom() {
+ const response = await this.sendCommand(this.CMD_ROM_READ, [0x00]);
+ const [...eepromBytes] = response;
+ return eepromBytes;
+ }
+
+ async getFrequency() {
+ const response = await this.sendCommand(this.CMD_FREQUENCY, [0x00, 0x00, 0x00, 0x00]);
+ const [...frequencyBytes] = response;
+ const frequencyInHz =
+ (frequencyBytes[0] << 24) | (frequencyBytes[1] << 16) | (frequencyBytes[2] << 8) | frequencyBytes[3];
+ return frequencyInHz;
+ }
+
+ async getBandwidth() {
+ const response = await this.sendCommand(this.CMD_BANDWIDTH, [0x00, 0x00, 0x00, 0x00]);
+ const [...bandwidthBytes] = response;
+ const bandwidthInHz =
+ (bandwidthBytes[0] << 24) | (bandwidthBytes[1] << 16) | (bandwidthBytes[2] << 8) | bandwidthBytes[3];
+ return bandwidthInHz;
+ }
+
+ async getTxPower() {
+ const response = await this.sendCommand(this.CMD_TXPOWER, [0xff]);
+ const [txPower] = response;
+ return txPower;
+ }
+
+ async getSpreadingFactor() {
+ const response = await this.sendCommand(this.CMD_SF, [0xff]);
+ const [spreadingFactor] = response;
+ return spreadingFactor;
+ }
+
+ async getCodingRate() {
+ const response = await this.sendCommand(this.CMD_CR, [0xff]);
+ const [codingRate] = response;
+ return codingRate;
+ }
+
+ async getRadioState() {
+ const response = await this.sendCommand(this.CMD_RADIO_STATE, [0xff]);
+ const [radioState] = response;
+ return radioState;
+ }
+
+ async getRxStat() {
+ const response = await this.sendCommand(this.CMD_STAT_RX, [0x00]);
+ const [...statBytes] = response;
+ const stat = (statBytes[0] << 24) | (statBytes[1] << 16) | (statBytes[2] << 8) | statBytes[3];
+ return stat;
+ }
+
+ async getTxStat() {
+ const response = await this.sendCommand(this.CMD_STAT_TX, [0x00]);
+ const [...statBytes] = response;
+ const stat = (statBytes[0] << 24) | (statBytes[1] << 16) | (statBytes[2] << 8) | statBytes[3];
+ return stat;
+ }
+
+ async getRssiStat() {
+ const response = await this.sendCommand(this.CMD_STAT_RSSI, [0x00]);
+ const [rssi] = response;
+ return rssi;
+ }
+
+ async disableBluetooth() {
+ await this.sendKissCommand([this.CMD_BT_CTRL, 0x00]);
+ }
+
+ async enableBluetooth() {
+ await this.sendKissCommand([this.CMD_BT_CTRL, 0x01]);
+ }
+
+ async startBluetoothPairing(pinCallback) {
+ this.callbacks[this.CMD_BT_PIN] = (response) => {
+ const [...pinBytes] = response;
+ const pin = (pinBytes[0] << 24) | (pinBytes[1] << 16) | (pinBytes[2] << 8) | pinBytes[3];
+ pinCallback(pin);
+ };
+
+ await this.sendKissCommand([this.CMD_BT_CTRL, 0x02]);
+ }
+
+ async readDisplay() {
+ const response = await this.sendCommand(this.CMD_DISP_READ, [0x01]);
+ const [...displayBuffer] = response;
+ return displayBuffer;
+ }
+
+ async setFrequency(frequencyInHz) {
+ const c1 = frequencyInHz >> 24;
+ const c2 = (frequencyInHz >> 16) & 0xff;
+ const c3 = (frequencyInHz >> 8) & 0xff;
+ const c4 = frequencyInHz & 0xff;
+ await this.sendKissCommand([this.CMD_FREQUENCY, c1, c2, c3, c4]);
+ }
+
+ async setBandwidth(bandwidthInHz) {
+ const c1 = bandwidthInHz >> 24;
+ const c2 = (bandwidthInHz >> 16) & 0xff;
+ const c3 = (bandwidthInHz >> 8) & 0xff;
+ const c4 = bandwidthInHz & 0xff;
+ await this.sendKissCommand([this.CMD_BANDWIDTH, c1, c2, c3, c4]);
+ }
+
+ async setTxPower(db) {
+ await this.sendKissCommand([this.CMD_TXPOWER, db]);
+ }
+
+ async setSpreadingFactor(spreadingFactor) {
+ await this.sendKissCommand([this.CMD_SF, spreadingFactor]);
+ }
+
+ async setCodingRate(codingRate) {
+ await this.sendKissCommand([this.CMD_CR, codingRate]);
+ }
+
+ async setRadioStateOn() {
+ await this.sendKissCommand([this.CMD_RADIO_STATE, this.RADIO_STATE_ON]);
+ }
+
+ async setRadioStateOff() {
+ await this.sendKissCommand([this.CMD_RADIO_STATE, this.RADIO_STATE_OFF]);
+ }
+
+ async saveConfig() {
+ await this.sendKissCommand([this.CMD_CONF_SAVE, 0x00]);
+ }
+
+ async deleteConfig() {
+ await this.sendKissCommand([this.CMD_CONF_DELETE, 0x00]);
+ }
+
+ async indicateFirmwareUpdate() {
+ await this.sendKissCommand([this.CMD_FW_UPD, 0x01]);
+ }
+
+ async setFirmwareHash(hash) {
+ await this.sendKissCommand([this.CMD_FW_HASH, ...hash]);
+ }
+
+ async writeRom(address, value) {
+ await this.sendKissCommand([this.CMD_ROM_WRITE, address, value]);
+ await RNodeUtils.sleepMillis(85);
+ }
+
+ async wipeRom() {
+ await this.sendKissCommand([this.CMD_UNLOCK_ROM, this.ROM_UNLOCK_BYTE]);
+ await RNodeUtils.sleepMillis(30000);
+ }
+
+ async getRomAsObject() {
+ const rom = await this.getRom();
+ return new ROM(rom);
+ }
+
+ async setDisplayRotation(rotation) {
+ await this.sendKissCommand([this.CMD_DISP_ROT, rotation & 0xff]);
+ }
+
+ async startDisplayReconditioning() {
+ await this.sendKissCommand([this.CMD_DISP_RCND, 0x01]);
+ }
+}
diff --git a/meshchatx/src/frontend/js/rnode/RNodeUtils.js b/meshchatx/src/frontend/js/rnode/RNodeUtils.js
new file mode 100644
index 00000000..931fcfed
--- /dev/null
+++ b/meshchatx/src/frontend/js/rnode/RNodeUtils.js
@@ -0,0 +1,49 @@
+export default class RNodeUtils {
+ /**
+ * Waits for the provided milliseconds, and then resolves.
+ * @param millis
+ * @returns {Promise<void>}
+ */
+ static async sleepMillis(millis) {
+ await new Promise((resolve) => {
+ setTimeout(resolve, millis);
+ });
+ }
+
+ static bytesToHex(bytes) {
+ for (var hex = [], i = 0; i < bytes.length; i++) {
+ var current = bytes[i] < 0 ? bytes[i] + 256 : bytes[i];
+ hex.push((current >>> 4).toString(16));
+ hex.push((current & 0xf).toString(16));
+ }
+ return hex.join("");
+ }
+
+ static md5(data) {
+ // We will use CryptoJS if available on window, or we might need to import it.
+ // For now, let's assume we will import it or it will be provided.
+ // In the original it was using CryptoJS.MD5
+ if (typeof window !== "undefined" && window.CryptoJS) {
+ var bytes = [];
+ const hash = window.CryptoJS.MD5(window.CryptoJS.enc.Hex.parse(this.bytesToHex(data)));
+ for (var i = 0; i < hash.sigBytes; i++) {
+ bytes.push((hash.words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);
+ }
+ return bytes;
+ }
+ throw new Error("CryptoJS not found");
+ }
+
+ static packUInt32BE(value) {
+ const buffer = new ArrayBuffer(4);
+ const view = new DataView(buffer);
+ view.setUint32(0, value, false);
+ return new Uint8Array(buffer);
+ }
+
+ static unpackUInt32BE(byteArray) {
+ const buffer = new Uint8Array(byteArray).buffer;
+ const view = new DataView(buffer);
+ return view.getUint32(0, false);
+ }
+}
diff --git a/meshchatx/src/frontend/js/rnode/ROM.js b/meshchatx/src/frontend/js/rnode/ROM.js
new file mode 100644
index 00000000..5631f45e
--- /dev/null
+++ b/meshchatx/src/frontend/js/rnode/ROM.js
@@ -0,0 +1,244 @@
+import RNodeUtils from "./RNodeUtils.js";
+
+export default class ROM {
+ static PLATFORM_AVR = 0x90;
+ static PLATFORM_ESP32 = 0x80;
+ static PLATFORM_NRF52 = 0x70;
+
+ static MCU_1284P = 0x91;
+ static MCU_2560 = 0x92;
+ static MCU_ESP32 = 0x81;
+ static MCU_NRF52 = 0x71;
+
+ static PRODUCT_RAK4631 = 0x10;
+ static MODEL_11 = 0x11;
+ static MODEL_12 = 0x12;
+
+ static PRODUCT_RNODE = 0x03;
+ static MODEL_A1 = 0xa1;
+ static MODEL_A6 = 0xa6;
+ static MODEL_A4 = 0xa4;
+ static MODEL_A9 = 0xa9;
+ static MODEL_A3 = 0xa3;
+ static MODEL_A8 = 0xa8;
+ static MODEL_A2 = 0xa2;
+ static MODEL_A7 = 0xa7;
+ static MODEL_A5 = 0xa5;
+ static MODEL_AA = 0xaa;
+ static MODEL_AC = 0xac;
+
+ static PRODUCT_T32_10 = 0xb2;
+ static MODEL_BA = 0xba;
+ static MODEL_BB = 0xbb;
+
+ static PRODUCT_T32_20 = 0xb0;
+ static MODEL_B3 = 0xb3;
+ static MODEL_B8 = 0xb8;
+
+ static PRODUCT_T32_21 = 0xb1;
+ static MODEL_B4 = 0xb4;
+ static MODEL_B9 = 0xb9;
+ static MODEL_B4_TCXO = 0x04;
+ static MODEL_B9_TCXO = 0x09;
+
+ static PRODUCT_H32_V2 = 0xc0;
+ static MODEL_C4 = 0xc4;
+ static MODEL_C9 = 0xc9;
+
+ static PRODUCT_H32_V3 = 0xc1;
+ static MODEL_C5 = 0xc5;
+ static MODEL_CA = 0xca;
+
+ static PRODUCT_HELTEC_T114 = 0xc2;
+ static MODEL_C6 = 0xc6;
+ static MODEL_C7 = 0xc7;
+
+ static PRODUCT_TBEAM = 0xe0;
+ static MODEL_E4 = 0xe4;
+ static MODEL_E9 = 0xe9;
+ static MODEL_E3 = 0xe3;
+ static MODEL_E8 = 0xe8;
+
+ static PRODUCT_TBEAM_S_V1 = 0xea;
+ static MODEL_DB = 0xdb;
+ static MODEL_DC = 0xdc;
+
+ static PRODUCT_TDECK = 0xd0;
+ static MODEL_D4 = 0xd4;
+ static MODEL_D9 = 0xd9;
+
+ static PRODUCT_TECHO = 0x15;
+ static MODEL_16 = 0x16;
+ static MODEL_17 = 0x17;
+
+ static PRODUCT_HMBRW = 0xf0;
+ static MODEL_FF = 0xff;
+ static MODEL_FE = 0xfe;
+
+ static ADDR_PRODUCT = 0x00;
+ static ADDR_MODEL = 0x01;
+ static ADDR_HW_REV = 0x02;
+ static ADDR_SERIAL = 0x03;
+ static ADDR_MADE = 0x07;
+ static ADDR_CHKSUM = 0x0b;
+ static ADDR_SIGNATURE = 0x1b;
+ static ADDR_INFO_LOCK = 0x9b;
+ static ADDR_CONF_SF = 0x9c;
+ static ADDR_CONF_CR = 0x9d;
+ static ADDR_CONF_TXP = 0x9e;
+ static ADDR_CONF_BW = 0x9f;
+ static ADDR_CONF_FREQ = 0xa3;
+ static ADDR_CONF_OK = 0xa7;
+
+ static INFO_LOCK_BYTE = 0x73;
+ static CONF_OK_BYTE = 0x73;
+
+ static BOARD_RNODE = 0x31;
+ static BOARD_HMBRW = 0x32;
+ static BOARD_TBEAM = 0x33;
+ static BOARD_HUZZAH32 = 0x34;
+ static BOARD_GENERIC_ESP32 = 0x35;
+ static BOARD_LORA32_V2_0 = 0x36;
+ static BOARD_LORA32_V2_1 = 0x37;
+ static BOARD_RAK4631 = 0x51;
+
+ static MANUAL_FLASH_MODELS = [ROM.MODEL_A1, ROM.MODEL_A6];
+
+ constructor(eeprom) {
+ this.eeprom = eeprom;
+ }
+
+ getProduct() {
+ return this.eeprom[ROM.ADDR_PRODUCT];
+ }
+
+ getModel() {
+ return this.eeprom[ROM.ADDR_MODEL];
+ }
+
+ getHardwareRevision() {
+ return this.eeprom[ROM.ADDR_HW_REV];
+ }
+
+ getSerialNumber() {
+ return [
+ this.eeprom[ROM.ADDR_SERIAL],
+ this.eeprom[ROM.ADDR_SERIAL + 1],
+ this.eeprom[ROM.ADDR_SERIAL + 2],
+ this.eeprom[ROM.ADDR_SERIAL + 3],
+ ];
+ }
+
+ getMade() {
+ return [
+ this.eeprom[ROM.ADDR_MADE],
+ this.eeprom[ROM.ADDR_MADE + 1],
+ this.eeprom[ROM.ADDR_MADE + 2],
+ this.eeprom[ROM.ADDR_MADE + 3],
+ ];
+ }
+
+ getChecksum() {
+ const checksum = [];
+ for (var i = 0; i < 16; i++) {
+ checksum.push(this.eeprom[ROM.ADDR_CHKSUM + i]);
+ }
+ return checksum;
+ }
+
+ getSignature() {
+ const signature = [];
+ for (var i = 0; i < 128; i++) {
+ signature.push(this.eeprom[ROM.ADDR_SIGNATURE + i]);
+ }
+ return signature;
+ }
+
+ getCalculatedChecksum() {
+ return RNodeUtils.md5([
+ this.getProduct(),
+ this.getModel(),
+ this.getHardwareRevision(),
+ ...this.getSerialNumber(),
+ ...this.getMade(),
+ ]);
+ }
+
+ getConfiguredSpreadingFactor() {
+ return this.eeprom[ROM.ADDR_CONF_SF];
+ }
+
+ getConfiguredCodingRate() {
+ return this.eeprom[ROM.ADDR_CONF_CR];
+ }
+
+ getConfiguredTxPower() {
+ return this.eeprom[ROM.ADDR_CONF_TXP];
+ }
+
+ getConfiguredFrequency() {
+ return (
+ (this.eeprom[ROM.ADDR_CONF_FREQ] << 24) |
+ (this.eeprom[ROM.ADDR_CONF_FREQ + 1] << 16) |
+ (this.eeprom[ROM.ADDR_CONF_FREQ + 2] << 8) |
+ this.eeprom[ROM.ADDR_CONF_FREQ + 3]
+ );
+ }
+
+ getConfiguredBandwidth() {
+ return (
+ (this.eeprom[ROM.ADDR_CONF_BW] << 24) |
+ (this.eeprom[ROM.ADDR_CONF_BW + 1] << 16) |
+ (this.eeprom[ROM.ADDR_CONF_BW + 2] << 8) |
+ this.eeprom[ROM.ADDR_CONF_BW + 3]
+ );
+ }
+
+ isInfoLocked() {
+ return this.eeprom[ROM.ADDR_INFO_LOCK] === ROM.INFO_LOCK_BYTE;
+ }
+
+ isConfigured() {
+ return this.eeprom[ROM.ADDR_CONF_OK] === ROM.CONF_OK_BYTE;
+ }
+
+ parse() {
+ if (!this.isInfoLocked()) {
+ return null;
+ }
+
+ const checksumHex = RNodeUtils.bytesToHex(this.getChecksum());
+ const calculatedChecksumHex = RNodeUtils.bytesToHex(this.getCalculatedChecksum());
+ const signatureHex = RNodeUtils.bytesToHex(this.getSignature());
+
+ var details = {
+ is_provisioned: true,
+ is_configured: this.isConfigured(),
+ product: this.getProduct(),
+ model: this.getModel(),
+ hardware_revision: this.getHardwareRevision(),
+ serial_number: RNodeUtils.unpackUInt32BE(this.getSerialNumber()),
+ made: RNodeUtils.unpackUInt32BE(this.getMade()),
+ checksum: checksumHex,
+ calculated_checksum: calculatedChecksumHex,
+ signature: signatureHex,
+ };
+
+ if (details.is_configured) {
+ details = {
+ ...details,
+ configured_spreading_factor: this.getConfiguredSpreadingFactor(),
+ configured_coding_rate: this.getConfiguredCodingRate(),
+ configured_tx_power: this.getConfiguredTxPower(),
+ configured_frequency: this.getConfiguredFrequency(),
+ configured_bandwidth: this.getConfiguredBandwidth(),
+ };
+ }
+
+ if (details.checksum !== details.calculated_checksum) {
+ details.is_provisioned = false;
+ }
+
+ return details;
+ }
+}
diff --git a/meshchatx/src/frontend/js/rnode/products.js b/meshchatx/src/frontend/js/rnode/products.js
new file mode 100644
index 00000000..0282dee3
--- /dev/null
+++ b/meshchatx/src/frontend/js/rnode/products.js
@@ -0,0 +1,515 @@
+import ROM from "./ROM.js";
+
+export default [
+ {
+ name: "Heltec LoRa32 v2",
+ id: ROM.PRODUCT_H32_V2,
+ platform: ROM.PLATFORM_ESP32,
+ models: [
+ {
+ id: ROM.MODEL_C4,
+ name: "433 MHz",
+ },
+ {
+ id: ROM.MODEL_C9,
+ name: "868 MHz / 915 MHz / 923 MHz",
+ },
+ ],
+ firmware_filename: "rnode_firmware_heltec32v2.zip",
+ flash_config: {
+ flash_size: "8MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_heltec32v2.boot_app0",
+ "0x1000": "rnode_firmware_heltec32v2.bootloader",
+ "0x10000": "rnode_firmware_heltec32v2.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_heltec32v2.partitions",
+ },
+ },
+ },
+ {
+ name: "Heltec LoRa32 v3",
+ id: ROM.PRODUCT_H32_V3,
+ platform: ROM.PLATFORM_ESP32,
+ models: [
+ {
+ id: ROM.MODEL_C5,
+ name: "433 MHz",
+ },
+ {
+ id: ROM.MODEL_CA,
+ name: "868 MHz / 915 MHz / 923 MHz",
+ },
+ ],
+ firmware_filename: "rnode_firmware_heltec32v3.zip",
+ flash_config: {
+ flash_size: "8MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_heltec32v3.boot_app0",
+ "0x0": "rnode_firmware_heltec32v3.bootloader",
+ "0x10000": "rnode_firmware_heltec32v3.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_heltec32v3.partitions",
+ },
+ },
+ },
+ {
+ name: "Heltec LoRa32 v4",
+ id: ROM.PRODUCT_H32_V4,
+ platform: ROM.PLATFORM_ESP32,
+ models: [
+ {
+ id: ROM.MODEL_C8,
+ name: "868 MHz / 915 MHz / 923 MHz with PA",
+ },
+ ],
+ firmware_filename: "rnode_firmware_heltec32v4pa.zip",
+ flash_config: {
+ flash_size: "16MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_heltec32v4pa.boot_app0",
+ "0x0": "rnode_firmware_heltec32v4pa.bootloader",
+ "0x10000": "rnode_firmware_heltec32v4pa.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_heltec32v4pa.partitions",
+ },
+ },
+ },
+ {
+ name: "Heltec T114",
+ id: ROM.PRODUCT_HELTEC_T114,
+ platform: ROM.PLATFORM_NRF52,
+ models: [
+ {
+ id: ROM.MODEL_C6,
+ name: "470-510 MHz (HT-n5262-LF)",
+ },
+ {
+ id: ROM.MODEL_C7,
+ name: "863-928 MHz (HT-n5262-HF)",
+ },
+ ],
+ firmware_filename: "rnode_firmware_heltec_t114.zip",
+ },
+ {
+ name: "LilyGO LoRa32 v1.0",
+ id: ROM.PRODUCT_T32_10,
+ platform: ROM.PLATFORM_ESP32,
+ models: [
+ {
+ id: ROM.MODEL_BA,
+ name: "433 MHz",
+ },
+ {
+ id: ROM.MODEL_BB,
+ name: "868 MHz / 915 MHz / 923 MHz",
+ },
+ ],
+ firmware_filename: "rnode_firmware_lora32v10.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_lora32v10.boot_app0",
+ "0x1000": "rnode_firmware_lora32v10.bootloader",
+ "0x10000": "rnode_firmware_lora32v10.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_lora32v10.partitions",
+ },
+ },
+ },
+ {
+ name: "LilyGO LoRa32 v2.0",
+ id: ROM.PRODUCT_T32_20,
+ platform: ROM.PLATFORM_ESP32,
+ models: [
+ {
+ id: ROM.MODEL_B3,
+ name: "433 MHz",
+ },
+ {
+ id: ROM.MODEL_B8,
+ name: "868 MHz / 915 MHz / 923 MHz",
+ },
+ ],
+ firmware_filename: "rnode_firmware_lora32v20.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_lora32v20.boot_app0",
+ "0x1000": "rnode_firmware_lora32v20.bootloader",
+ "0x10000": "rnode_firmware_lora32v20.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_lora32v20.partitions",
+ },
+ },
+ },
+ {
+ name: "LilyGO LoRa32 v2.1",
+ id: ROM.PRODUCT_T32_21,
+ platform: ROM.PLATFORM_ESP32,
+ models: [
+ {
+ id: ROM.MODEL_B4,
+ name: "433 MHz",
+ firmware_filename: "rnode_firmware_lora32v21.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_lora32v21.boot_app0",
+ "0x1000": "rnode_firmware_lora32v21.bootloader",
+ "0x10000": "rnode_firmware_lora32v21.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_lora32v21.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_B9,
+ name: "868/915/923 MHz",
+ firmware_filename: "rnode_firmware_lora32v21.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_lora32v21.boot_app0",
+ "0x1000": "rnode_firmware_lora32v21.bootloader",
+ "0x10000": "rnode_firmware_lora32v21.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_lora32v21.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_B4_TCXO,
+ mapped_id: ROM.MODEL_B4,
+ name: "433 MHz, with TCXO",
+ firmware_filename: "rnode_firmware_lora32v21_tcxo.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_lora32v21_tcxo.boot_app0",
+ "0x1000": "rnode_firmware_lora32v21_tcxo.bootloader",
+ "0x10000": "rnode_firmware_lora32v21_tcxo.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_lora32v21_tcxo.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_B9_TCXO,
+ mapped_id: ROM.MODEL_B9,
+ name: "868/915/923 MHz, with TCXO",
+ firmware_filename: "rnode_firmware_lora32v21_tcxo.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_lora32v21_tcxo.boot_app0",
+ "0x1000": "rnode_firmware_lora32v21_tcxo.bootloader",
+ "0x10000": "rnode_firmware_lora32v21_tcxo.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_lora32v21_tcxo.partitions",
+ },
+ },
+ },
+ ],
+ },
+ {
+ name: "LilyGO LoRa T3S3",
+ id: ROM.PRODUCT_RNODE,
+ platform: ROM.PLATFORM_ESP32,
+ models: [
+ {
+ id: ROM.MODEL_A5,
+ name: "433 MHz (with SX1278 chip)",
+ firmware_filename: "rnode_firmware_t3s3_sx127x.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_t3s3_sx127x.boot_app0",
+ "0x0": "rnode_firmware_t3s3_sx127x.bootloader",
+ "0x10000": "rnode_firmware_t3s3_sx127x.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_t3s3_sx127x.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_AA,
+ name: "868/915/923 MHz (with SX1276 chip)",
+ firmware_filename: "rnode_firmware_t3s3_sx127x.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_t3s3_sx127x.boot_app0",
+ "0x0": "rnode_firmware_t3s3_sx127x.bootloader",
+ "0x10000": "rnode_firmware_t3s3_sx127x.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_t3s3_sx127x.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_A1,
+ name: "433 MHz (with SX1268 chip)",
+ firmware_filename: "rnode_firmware_t3s3.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_t3s3.boot_app0",
+ "0x0": "rnode_firmware_t3s3.bootloader",
+ "0x10000": "rnode_firmware_t3s3.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_t3s3.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_A6,
+ name: "868/915/923 MHz (with SX1262 chip)",
+ firmware_filename: "rnode_firmware_t3s3.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_t3s3.boot_app0",
+ "0x0": "rnode_firmware_t3s3.bootloader",
+ "0x10000": "rnode_firmware_t3s3.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_t3s3.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_AC,
+ name: "2.4 GHz (with SX1280 chip)",
+ firmware_filename: "rnode_firmware_t3s3_sx1280_pa.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_t3s3_sx1280_pa.boot_app0",
+ "0x0": "rnode_firmware_t3s3_sx1280_pa.bootloader",
+ "0x10000": "rnode_firmware_t3s3_sx1280_pa.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_t3s3_sx1280_pa.partitions",
+ },
+ },
+ },
+ ],
+ },
+ {
+ name: "LilyGO T-Beam",
+ id: ROM.PRODUCT_TBEAM,
+ platform: ROM.PLATFORM_ESP32,
+ models: [
+ {
+ id: ROM.MODEL_E4,
+ name: "433 MHz (with SX1278 chip)",
+ firmware_filename: "rnode_firmware_tbeam.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_tbeam.boot_app0",
+ "0x1000": "rnode_firmware_tbeam.bootloader",
+ "0x10000": "rnode_firmware_tbeam.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_tbeam.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_E9,
+ name: "868/915/923 MHz (with SX1276 chip)",
+ firmware_filename: "rnode_firmware_tbeam.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_tbeam.boot_app0",
+ "0x1000": "rnode_firmware_tbeam.bootloader",
+ "0x10000": "rnode_firmware_tbeam.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_tbeam.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_E3,
+ name: "433 MHz (with SX1268 chip)",
+ firmware_filename: "rnode_firmware_tbeam_sx1262.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_tbeam_sx1262.boot_app0",
+ "0x1000": "rnode_firmware_tbeam_sx1262.bootloader",
+ "0x10000": "rnode_firmware_tbeam_sx1262.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_tbeam_sx1262.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_E8,
+ name: "868/915/923 MHz (with SX1262 chip)",
+ firmware_filename: "rnode_firmware_tbeam_sx1262.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_tbeam_sx1262.boot_app0",
+ "0x1000": "rnode_firmware_tbeam_sx1262.bootloader",
+ "0x10000": "rnode_firmware_tbeam_sx1262.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_tbeam_sx1262.partitions",
+ },
+ },
+ },
+ ],
+ },
+ {
+ name: "LilyGO T-Beam Supreme",
+ id: ROM.PRODUCT_TBEAM_S_V1,
+ platform: ROM.PLATFORM_ESP32,
+ models: [
+ {
+ id: ROM.MODEL_DB,
+ name: "433 MHz (with SX1268 chip)",
+ },
+ {
+ id: ROM.MODEL_DC,
+ name: "868/915/923 MHz (with SX1262 chip)",
+ },
+ ],
+ firmware_filename: "rnode_firmware_tbeam_supreme.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_tbeam_supreme.boot_app0",
+ "0x0": "rnode_firmware_tbeam_supreme.bootloader",
+ "0x10000": "rnode_firmware_tbeam_supreme.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_tbeam_supreme.partitions",
+ },
+ },
+ },
+ {
+ name: "LilyGO T-Deck",
+ id: ROM.PRODUCT_TDECK,
+ platform: ROM.PLATFORM_ESP32,
+ models: [
+ {
+ id: ROM.MODEL_D4,
+ name: "433 MHz (with SX1268 chip)",
+ },
+ {
+ id: ROM.MODEL_D9,
+ name: "868/915/923 MHz (with SX1262 chip)",
+ },
+ ],
+ firmware_filename: "rnode_firmware_tdeck.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_tdeck.boot_app0",
+ "0x0": "rnode_firmware_tdeck.bootloader",
+ "0x10000": "rnode_firmware_tdeck.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_tdeck.partitions",
+ },
+ },
+ },
+ {
+ name: "LilyGO T-Echo",
+ id: ROM.PRODUCT_TECHO,
+ platform: ROM.PLATFORM_NRF52,
+ models: [
+ {
+ id: ROM.MODEL_16,
+ name: "433 MHz",
+ },
+ {
+ id: ROM.MODEL_17,
+ name: "868 MHz / 915 MHz / 923 MHz",
+ },
+ ],
+ firmware_filename: "rnode_firmware_techo.zip",
+ },
+ {
+ name: "RAK4631",
+ id: ROM.PRODUCT_RAK4631,
+ platform: ROM.PLATFORM_NRF52,
+ models: [
+ {
+ id: ROM.MODEL_11,
+ name: "433 MHz",
+ },
+ {
+ id: ROM.MODEL_12,
+ name: "868 MHz / 915 MHz / 923 MHz",
+ },
+ ],
+ firmware_filename: "rnode_firmware_rak4631.zip",
+ },
+ {
+ name: "RNode",
+ id: ROM.PRODUCT_RNODE,
+ platform: ROM.PLATFORM_ESP32,
+ models: [
+ {
+ id: ROM.MODEL_A2,
+ name: "Handheld v2.1 RNode, 410 - 525 MHz",
+ firmware_filename: "rnode_firmware_ng21.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_ng21.boot_app0",
+ "0x1000": "rnode_firmware_ng21.bootloader",
+ "0x10000": "rnode_firmware_ng21.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_ng21.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_A7,
+ name: "Handheld v2.1 RNode, 820 - 1020 MHz",
+ firmware_filename: "rnode_firmware_ng21.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_ng21.boot_app0",
+ "0x1000": "rnode_firmware_ng21.bootloader",
+ "0x10000": "rnode_firmware_ng21.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_ng21.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_A1,
+ name: "Prototype v2.2 RNode, 410 - 525 MHz",
+ firmware_filename: "rnode_firmware_t3s3.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_t3s3.boot_app0",
+ "0x0": "rnode_firmware_t3s3.bootloader",
+ "0x10000": "rnode_firmware_t3s3.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_t3s3.partitions",
+ },
+ },
+ },
+ {
+ id: ROM.MODEL_A6,
+ name: "Prototype v2.2 RNode, 820 - 1020 MHz",
+ firmware_filename: "rnode_firmware_t3s3.zip",
+ flash_config: {
+ flash_size: "4MB",
+ flash_files: {
+ "0xe000": "rnode_firmware_t3s3.boot_app0",
+ "0x0": "rnode_firmware_t3s3.bootloader",
+ "0x10000": "rnode_firmware_t3s3.bin",
+ "0x210000": "console_image.bin",
+ "0x8000": "rnode_firmware_t3s3.partitions",
+ },
+ },
+ },
+ ],
+ },
+];
diff --git a/meshchatx/src/frontend/locales/de.json b/meshchatx/src/frontend/locales/de.json
index c5dc97b0..10eed8a6 100644
--- a/meshchatx/src/frontend/locales/de.json
+++ b/meshchatx/src/frontend/locales/de.json
@@ -520,7 +520,129 @@
},
"rnode_flasher": {
"title": "RNode Flasher",
- "description": "RNode-Adapter flashen und aktualisieren, ohne die Kommandozeile zu berühren."
+ "description": "RNode-Adapter flashen und aktualisieren, ohne die Kommandozeile zu berühren.",
+ "select_device": "1. Wählen Sie Ihr Gerät aus",
+ "product": "Produkt",
+ "model": "Modell",
+ "select_product": "Produkt auswählen",
+ "select_model": "Modell auswählen",
+ "enter_dfu_mode": "DFU-Modus aufrufen",
+ "entering_dfu_mode": "DFU-Modus wird aufgerufen...",
+ "find_device_issue": "Gerät nicht gefunden? Öffnen Sie ein Ticket auf",
+ "select_firmware": "2. Firmware zum Flashen auswählen (.zip)",
+ "flash_now": "Jetzt flashen",
+ "flashing": "Flashen: {percentage}%",
+ "flashing_file_progress": "Datei {current}/{total}: {percentage}%",
+ "connecting_device": "Verbindung zum Gerät wird hergestellt...",
+ "download_firmware": "Firmware herunterladen",
+ "official_firmware": "Offizielle Firmware",
+ "ce_firmware": "CE Firmware",
+ "transport_node_firmware": "Transport Node Firmware",
+ "common_issues": "Häufige Probleme",
+ "hardware_failure": "Hardwarefehler:",
+ "provision_eeprom_hint": "Sie müssen das EEPROM in Schritt 3 bereitstellen.",
+ "firmware_corrupt": "Firmware beschädigt:",
+ "set_firmware_hash_hint": "Sie müssen den Firmware-Hash in Schritt 4 setzen.",
+ "step_provision": "3. EEPROM bereitstellen",
+ "provision_description": "Setzt Geräteinfo, Prüfsumme und leere Signatur",
+ "provision": "Bereitstellen",
+ "provisioning_wait": "Bereitstellung: Bitte warten...",
+ "step_set_hash": "4. Firmware-Hash setzen",
+ "set_hash_description": "Verwendet Hash vom Board",
+ "set_firmware_hash": "Firmware-Hash setzen",
+ "setting_hash_wait": "Firmware-Hash wird gesetzt: Bitte warten...",
+ "step_done": "5. Abschließen",
+ "download_recommended": "Empfohlene Firmware herunterladen & laden",
+ "downloading": "Herunterladen...",
+ "done_description": "Wenn Sie es bis hierher geschafft haben und alle vorherigen Schritte erfolgreich waren, sollte Ihr RNode einsatzbereit sein.",
+ "meshchat_usage": "Um RNode mit MeshChat zu verwenden, müssen Sie ein RNodeInterface auf der Seite Schnittstellen → Schnittstelle hinzufügen hinzufügen.",
+ "sideband_usage": "Um RNode mit Sideband zu verwenden, müssen Sie es in Hardware → RNode konfigurieren und Konnektivität → Über RNode verbinden aktivieren.",
+ "restart_warning": "Sie müssen MeshChat und Sideband neu starten, damit Änderungen an den Schnittstelleneinstellungen wirksam werden, sonst passiert nichts!",
+ "advanced_tools": "Erweiterte Tools",
+ "detect_rnode": "RNode erkennen",
+ "reboot_rnode": "RNode neu starten",
+ "read_display": "Display lesen",
+ "dump_eeprom": "EEPROM dumpen",
+ "wipe_eeprom": "EEPROM löschen",
+ "eeprom_console_hint": "EEPROM-Dumps werden in der Entwickler-Konsole angezeigt.",
+ "configure_bluetooth": "Bluetooth konfigurieren (optional)",
+ "bluetooth_info_1": "Bluetooth wird nicht auf allen Geräten unterstützt.",
+ "bluetooth_info_2": "Einige Geräte verwenden Bluetooth Classic, andere BLE (Bluetooth Low Energy).",
+ "bluetooth_info_3": "Versetzen Sie den RNode in den Bluetooth-Kopplungsmodus und verbinden Sie ihn dann über die Android-Bluetooth-Einstellungen.",
+ "bluetooth_info_4": "Sobald Sie eine Kopplungsanfrage von Android initiiert haben, sollte eine PIN auf dem RNode-Display angezeigt werden.",
+ "bluetooth_info_5": "In Sideband müssen Sie 'Verbindung über Bluetooth' in Hardware → RNode aktivieren.",
+ "bluetooth_info_6": "Wenn Ihr Gerät BLE verwendet, müssen Sie auch 'Gerät erfordert BLE' in Hardware → RNode aktivieren.",
+ "bluetooth_restart_warning": "Vergessen Sie nicht, Sideband neu zu starten, damit die Einstellungen wirksam werden!",
+ "enable": "Aktivieren",
+ "disable": "Deaktivieren",
+ "start_pairing": "Kopplung starten",
+ "configure_tnc": "TNC-Modus konfigurieren (optional)",
+ "tnc_info_1": "Der TNC-Modus ermöglicht die Verwendung eines RNode als KISS-kompatibler TNC über die serielle Schnittstelle.",
+ "tnc_info_2": "Dieser Modus macht ihn nutzbar mit Amateurfunk-Software, die mit einem KISS-TNC über eine serielle Schnittstelle kommunizieren kann.",
+ "tnc_warning": "Sie müssen den TNC-Modus deaktiviert lassen, wenn Sie RNode mit Apps wie MeshChat oder Sideband verwenden.",
+ "frequency": "Frequenz (Hz)",
+ "bandwidth": "Bandbreite",
+ "tx_power": "Sendeleistung (dBm)",
+ "spreading_factor": "Spreizfaktor",
+ "coding_rate": "Coderate",
+ "configure_display": "Display konfigurieren",
+ "rotation": "Rotation",
+ "reconditioning": "Aufbereitung",
+ "start": "Start",
+ "stop": "Stopp",
+ "rotation_v180_warning": "Das Einstellen der Display-Rotation erfordert Firmware v1.80+",
+ "errors": {
+ "failed_download": "Fehler beim Herunterladen der Firmware: {error}",
+ "firmware_not_found_in_release": "Empfohlene Firmware im neuesten Release nicht gefunden.",
+ "web_serial_not_supported": "Web Serial wird von diesem Browser nicht unterstützt. Bitte verwenden Sie Chrome, Edge oder einen anderen Chromium-basierten Browser.",
+ "no_device_selected": "Kein Gerät ausgewählt. Bitte wählen Sie einen seriellen Port aus.",
+ "failed_connect": "Verbindung zum Gerät fehlgeschlagen: {error}",
+ "not_an_rnode": "Das ausgewählte Gerät ist kein RNode! Bitte stellen Sie sicher, dass Sie den richtigen seriellen Port ausgewählt haben.",
+ "failed_dfu": "Fehler beim Aufrufen des DFU-Modus: {error}",
+ "select_firmware_first": "Bitte wählen Sie zuerst eine Firmware-Datei (.zip) aus.",
+ "failed_flash": "Firmware-Flash fehlgeschlagen: {error}",
+ "esptool_not_loaded": "esptool-js konnte nicht geladen werden. Bitte laden Sie die Seite neu und versuchen Sie es erneut.",
+ "no_flash_config": "Flash-Konfiguration für das ausgewählte Gerät nicht verfügbar. Bitte wählen Sie ein anderes Gerät aus oder überprüfen Sie die Firmware-Datei.",
+ "failed_extract": "Erforderliche Datei \"{file}\" in der Firmware-ZIP-Datei nicht gefunden. Bitte laden Sie die richtige Firmware für Ihr Gerät herunter.",
+ "failed_detect": "RNode konnte nicht erkannt werden. Stellen Sie sicher, dass das Gerät angeschlossen ist und sich im richtigen Modus befindet.",
+ "provisioned_already": "EEPROM ist bereits bereitgestellt. Sie müssen es löschen, um es erneut bereitzustellen!",
+ "select_product_first": "Bitte wählen Sie ein Produkt aus!",
+ "select_model_first": "Bitte wählen Sie ein Modell aus!",
+ "not_provisioned": "EEPROM ist nicht bereitgestellt. Sie müssen dies zuerst tun!",
+ "failed_provision": "Bereitstellung fehlgeschlagen: {error}",
+ "failed_set_hash": "Fehler beim Setzen des Firmware-Hash: {error}",
+ "failed_reboot": "Fehler beim Neustart des RNode: {error}",
+ "failed_read_display": "Fehler beim Lesen des Displays: {error}",
+ "failed_dump_eeprom": "Fehler beim Dumpen des EEPROM: {error}",
+ "failed_wipe_eeprom": "Fehler beim Löschen des EEPROM: {error}",
+ "failed_enable_tnc": "Fehler beim Aktivieren des TNC-Modus: {error}",
+ "failed_disable_tnc": "Fehler beim Deaktivieren des TNC-Modus: {error}",
+ "failed_enable_bluetooth": "Fehler beim Aktivieren von Bluetooth: {error}",
+ "failed_disable_bluetooth": "Fehler beim Deaktivieren von Bluetooth: {error}",
+ "failed_start_pairing": "Fehler beim Starten der Kopplung: {error}",
+ "failed_set_rotation": "Fehler beim Einstellen der Display-Rotation: {error}",
+ "failed_start_reconditioning": "Fehler beim Starten der Display-Aufbereitung: {error}"
+ },
+ "alerts": {
+ "firmware_downloaded": "Empfohlene Firmware wurde heruntergeladen und geladen.",
+ "dfu_ready": "Das Gerät sollte sich nun im DFU-Modus befinden. Sie können nun mit dem Flashen der Firmware fortfahren.",
+ "flash_success": "Firmware wurde erfolgreich geflasht!",
+ "rebooting": "Board startet neu!",
+ "eeprom_wipe_confirm": "Sind Sie sicher, dass Sie das EEPROM auf diesem Gerät löschen möchten? Dies dauert etwa 30 Sekunden. Eine Benachrichtigung wird angezeigt, wenn das Löschen des EEPROMs abgeschlossen ist.",
+ "eeprom_wiped": "EEPROM wurde gelöscht!",
+ "eeprom_dumped": "EEPROM in der Konsole ausgegeben",
+ "rnode_detected": "RNode v{version} erkannt",
+ "provision_success": "Gerät wurde bereitgestellt!",
+ "hash_success": "Firmware-Hash wurde gesetzt!",
+ "tnc_enabled": "TNC-Modus wurde aktiviert!",
+ "tnc_disabled": "TNC-Modus wurde deaktiviert!",
+ "bluetooth_enabled": "Bluetooth wurde aktiviert!",
+ "bluetooth_disabled": "Bluetooth wurde deaktiviert!",
+ "bluetooth_pairing_pin": "Bluetooth-Kopplungs-PIN: {pin}",
+ "bluetooth_pairing_started": "Kopplungsmodus gestartet (30s)",
+ "rotation_updated": "Rotation aktualisiert",
+ "reconditioning_started": "Aufbereitung gestartet"
+ }
},
"micron_editor": {
"title": "Micron Editor",
@@ -536,7 +658,9 @@
"rename_tab": "Tab umbenennen",
"confirm_reset": "Sind Sie sicher, dass Sie den Editor zurücksetzen möchten? Alle Ihre Tabs und Inhalte gehen verloren.",
"confirm_delete_tab": "Sind Sie sicher, dass Sie diesen Tab löschen möchten?",
- "main_tab": "Haupt"
+ "main_tab": "Haupt",
+ "guide_tab": "NomadNet Leitfaden",
+ "parser_by": "Micron Parser von"
},
"paper_message": {
"title": "Papiernachricht",
@@ -707,6 +831,7 @@
"unknown": "Unbekannt",
"call_ended": "Anruf beendet",
"call_declined": "Anruf abgelehnt",
+ "initiation": "Initiiere...",
"send_to_voicemail": "An Sprachnachricht senden",
"incoming_call": "Eingehender Anruf...",
"busy": "Besetzt...",
@@ -820,31 +945,132 @@
"failed_to_play_ringtone": "Klingelton konnte nicht abgespielt werden",
"failed_to_play_voicemail": "Sprachnachricht konnte nicht abgespielt werden"
},
+ "tutorial": {
+ "title": "Erste Schritte",
+ "welcome": "Willkommen bei",
+ "welcome_desc": "Die Zukunft der netzunabhängigen Kommunikation. Sicher, dezentral und unaufhaltsam.",
+ "security": "Sicherheit & Leistung",
+ "security_desc": "Massive Verbesserungen bei Geschwindigkeit, Sicherheit und Crash-Wiederherstellung.",
+ "security_desc_page": "Massive Verbesserungen bei Geschwindigkeit, Sicherheit und Integrität mit integrierter Crash-Wiederherstellung.",
+ "maps": "Karten",
+ "maps_desc": "OpenLayers mit MBTiles-Unterstützung (Export und Offline-Unterstützung) und benutzerdefinierten API-Endpunkten.",
+ "maps_desc_page": "OpenLayers-Unterstützung mit Offline-MBTiles (Export und Offline-Unterstützung) und benutzerdefinierten API-Endpunkten für Online-Karten.",
+ "voice": "Vollständige LXST-Stimme",
+ "voice_desc": "Voicemail, Klingeltöne, Telefonbuch und Kontaktfreigabe.",
+ "voice_desc_page": "Kristallklare Sprachanrufe über Mesh. Voicemail, benutzerdefinierte Klingeltöne und Telefonbuchsuche.",
+ "tools": "Erweiterte Werkzeuge",
+ "tools_desc": "Micron-Editor, NomadNet, RNS-Tools, Dokumentation.",
+ "tools_desc_page": "Micron-Editor, NomadNet-Knoten, RNS-Tools und integrierte Dokumentation.",
+ "archiver": "Archivierer",
+ "archiver_desc": "Manuelle und automatisierte Seitenarchivierung.",
+ "archiver_desc_page": "Manuelle und automatisierte Seitenarchivierungswerkzeuge für das Offline-Browsing.",
+ "banishment": "Verbannung",
+ "banishment_desc": "Verbannen Sie nervige Leute und Knoten, inklusive Unterstützung für RNS-Blackhole-Level-Ignorieren ihrer Ankündigungen.",
+ "palette": "Befehlspalette + Tastenkombinationen",
+ "palette_desc": "Navigieren Sie sofort überall hin und passen Sie Tastenkürzel an.",
+ "palette_desc_page": "Navigieren Sie durch die gesamte Anwendung und passen Sie Ihren Workflow mit sofortigen Tastenkürzeln an.",
+ "i18n": "i18n-Unterstützung",
+ "i18n_desc": "Verfügbar in Englisch, Deutsch und Russisch.",
+ "i18n_desc_page": "Vollständige Internationalisierungsunterstützung für die Sprachen Englisch, Deutsch und Russisch.",
+ "more_features": "+ viele weitere Funktionen!",
+ "connect": "Mit dem Mesh verbinden",
+ "connect_desc": "Um Nachrichten zu senden, müssen Sie sich mit einer Reticulum-Schnittstelle verbinden.",
+ "connect_desc_page": "Verwenden Sie eines der unten aufgeführten öffentlichen Netzwerke oder fügen Sie eine benutzerdefinierte Schnittstelle über die Seite 'Schnittstellen' hinzu.",
+ "suggested_networks": "Empfohlene öffentliche Netzwerke",
+ "suggested_relays": "Empfohlene Relais",
+ "use": "Verwenden",
+ "online": "Online",
+ "custom_interfaces": "Benutzerdefinierte Schnittstellen",
+ "custom_interfaces_desc": "Möchten Sie eine maßgeschneiderte Schnittstelle hinzufügen? Gehen Sie zur Seite 'Schnittstellen', um eine benutzerdefinierte Verbindung zu konfigurieren.",
+ "custom_interfaces_desc_page": "Für alle privaten Relais oder Hardware, die Sie selbst verwalten, fügen Sie diese über die dedizierte Seite 'Schnittstellen' hinzu.",
+ "open_interfaces": "Schnittstellenseite öffnen",
+ "learn_create": "Lernen & Erstellen",
+ "learn_create_desc": "Entdecken Sie, wie Sie MeshChatX optimal nutzen können.",
+ "learn_create_desc_page": "Entdecken Sie, wie Sie MeshChatX optimal nutzen und Ihre eigenen Inhalte erstellen können.",
+ "documentation": "Dokumentation",
+ "documentation_desc": "Lesen Sie die offizielle MeshChatX- und Reticulum-Dokumentation.",
+ "documentation_desc_page": "Umfassende Leitfäden für MeshChatX und den zugrunde liegenden Reticulum Network Stack.",
+ "meshchatx_docs": "MeshChatX-Dokumentation",
+ "reticulum_docs": "Reticulum-Dokumentation",
+ "read_meshchatx_docs": "MeshChatX-Dokumentation lesen",
+ "reticulum_manual": "Reticulum-Netzwerkhandbuch",
+ "micron_editor": "Micron-Editor",
+ "micron_editor_desc": "Werfen Sie einen Blick auf den Micron-Editor für eine Anleitung zum Erstellen von Mesh-nativen Seiten.",
+ "micron_editor_desc_page": "Erfahren Sie, wie Sie mit der Micron-Markup-Sprache Mesh-native Seiten und interaktive Inhalte erstellen.",
+ "open_micron_editor": "Micron-Editor öffnen",
+ "paper_messages": "NomadNet-Knoten erkunden",
+ "paper_messages_desc": "Dezentrale Seiten und Dienste durchsuchen.",
+ "send_messages": "Nachrichten senden",
+ "send_messages_desc": "Starten Sie eine sichere Unterhaltung.",
+ "explore_nodes": "Knoten visualisieren",
+ "explore_nodes_desc": "Netzwerkkarte und Topologie anzeigen.",
+ "voice_calls": "Sprachanrufe",
+ "voice_calls_desc": "Schauen Sie sich den fantastischen Klingelton-Editor an!",
+ "ready": "Bereit zum Loslegen!",
+ "ready_desc": "Alles ist eingerichtet. Sie müssen die Anwendung neu starten, damit die Änderungen wirksam werden.",
+ "ready_desc_page": "MeshChatX ist jetzt konfiguriert. Sie müssen die Anwendung neu starten, um die Verbindung abzuschließen.",
+ "docker_note": "Wenn Sie in Docker ausführen, stellen Sie sicher, dass Sie den Container neu starten.",
+ "restart_required": "Neustart erforderlich",
+ "restart_desc_page": "Wenn Sie in Docker ausführen, stellen Sie sicher, dass Sie den Container neu starten. Native Apps werden automatisch neu gestartet.",
+ "back": "Zurück",
+ "skip": "Überspringen",
+ "next": "Weiter",
+ "restart_start": "MeshChatX starten",
+ "skip_setup": "Setup überspringen",
+ "continue": "Weiter",
+ "skip_confirm": "Sind Sie sicher, dass Sie das Setup überspringen möchten? Sie müssen Schnittstellen später manuell hinzufügen."
+ },
"command_palette": {
- "search_placeholder": "Suchen oder Befehl eingeben...",
- "no_results": "Keine Ergebnisse gefunden für \"{query}\"",
- "nav_messages": "Zu Nachrichten gehen",
- "nav_messages_desc": "Öffnen Sie Ihre aktuellen Gespräche",
- "nav_nomad": "Zu Nomad Network gehen",
- "nav_nomad_desc": "Durchsuchen Sie das verteilte Web",
- "nav_map": "Zur Karte gehen",
- "nav_map_desc": "Peer-Standorte und Telemetrie anzeigen",
- "nav_paper": "Papiernachrichten-Generator",
- "nav_paper_desc": "Signierte QR-Code-Nachrichten generieren",
- "nav_call": "Zu Anrufen gehen",
- "nav_call_desc": "Sprachanrufe und Voicemails",
- "nav_settings": "Zu Einstellungen gehen",
- "nav_settings_desc": "App-Konfiguration und Einstellungen",
- "action_sync": "Nachrichten synchronisieren",
- "action_sync_desc": "Nachrichten vom Propagationsknoten anfordern",
- "action_compose": "Neue Nachricht verfassen",
- "action_compose_desc": "Starten Sie einen neuen Chat per Adresse",
- "action_orbit": "Orbit-Modus",
- "action_orbit_desc": "Weltraum-Orbit-Visualisierung umschalten",
- "group_recent": "Aktuelle Gespräche",
+ "search_placeholder": "Befehle suchen, navigieren oder Peers finden...",
+ "no_results": "Keine Ergebnisse für \"{query}\" gefunden",
+ "group_actions": "Aktionen",
+ "group_recent": "Kürzliche Peers",
"group_contacts": "Kontakte",
- "group_actions": "Schnellaktionen",
"footer_navigate": "Navigieren",
- "footer_select": "Auswählen"
+ "footer_select": "Auswählen",
+ "nav_messages": "Nachrichten",
+ "nav_messages_desc": "Nachrichtenseite öffnen",
+ "nav_nomad": "Nomad Network",
+ "nav_nomad_desc": "Nomad Network Seiten durchsuchen",
+ "nav_map": "Karte",
+ "nav_map_desc": "Netzwerktopologie-Karte anzeigen",
+ "nav_paper": "Papier-Nachrichten",
+ "nav_paper_desc": "Offline-Nachrichten erstellen",
+ "nav_call": "Sprachanrufe",
+ "nav_call_desc": "Sprachanrufseite öffnen",
+ "nav_settings": "Einstellungen",
+ "nav_settings_desc": "Einstellungsseite öffnen",
+ "nav_ping": "Ping",
+ "nav_ping_desc": "Netzwerkknoten pingen",
+ "nav_rnprobe": "RN Probe",
+ "nav_rnprobe_desc": "Reticulum-Knoten sondieren",
+ "nav_rncp": "RN CP",
+ "nav_rncp_desc": "Reticulum Control Protocol",
+ "nav_rnstatus": "RN Status",
+ "nav_rnstatus_desc": "Reticulum-Status anzeigen",
+ "nav_rnpath": "RN Pfad",
+ "nav_rnpath_desc": "Netzwerkpfade anzeigen",
+ "nav_translator": "Übersetzer",
+ "nav_translator_desc": "Nachrichten übersetzen",
+ "nav_forwarder": "Weiterleiter",
+ "nav_forwarder_desc": "Nachrichten-Weiterleitungs-Tool",
+ "nav_documentation": "Dokumentation",
+ "nav_documentation_desc": "Dokumentation anzeigen",
+ "nav_micron_editor": "Micron-Editor",
+ "nav_micron_editor_desc": "Mesh-native Seiten erstellen",
+ "nav_rnode_flasher": "RNode Flasher",
+ "nav_rnode_flasher_desc": "RNode-Firmware flashen",
+ "nav_debug_logs": "Debug-Logs",
+ "nav_debug_logs_desc": "Debug-Logs anzeigen",
+ "action_sync": "Nachrichten synchronisieren",
+ "action_sync_desc": "Mit Propagationsknoten synchronisieren",
+ "action_compose": "Nachricht verfassen",
+ "action_compose_desc": "Eine neue Nachricht beginnen",
+ "action_orbit": "Orbit umschalten",
+ "action_orbit_desc": "Orbit-Modus umschalten",
+ "action_getting_started": "Erste Schritte",
+ "action_getting_started_desc": "Einführungsleitfaden anzeigen",
+ "action_changelog": "Änderungsprotokoll",
+ "action_changelog_desc": "Was ist neu anzeigen"
}
}
diff --git a/meshchatx/src/frontend/locales/en.json b/meshchatx/src/frontend/locales/en.json
index 32fbd9f0..0cf09344 100644
--- a/meshchatx/src/frontend/locales/en.json
+++ b/meshchatx/src/frontend/locales/en.json
@@ -23,7 +23,7 @@
"tutorial_connect": "Connect to the Mesh",
"tutorial_finish": "Ready to Roll!",
"tutorial_restart_required": "Restart Required",
- "tutorial_docker_note": "If you're running in Docker, ensure your container auto-restarts.",
+ "tutorial_docker_note": "If you're running in Docker, ensure you restart the container.",
"my_identity": "My Identity",
"identity_hash": "Identity Hash",
"lxmf_address": "LXMF Address",
@@ -520,7 +520,129 @@
},
"rnode_flasher": {
"title": "RNode Flasher",
- "description": "Flash and update RNode adapters without touching the command line."
+ "description": "Flash and update RNode adapters without touching the command line.",
+ "select_device": "1. Select your device",
+ "product": "Product",
+ "model": "Model",
+ "select_product": "Select a Product",
+ "select_model": "Select a Model",
+ "enter_dfu_mode": "Enter DFU Mode",
+ "entering_dfu_mode": "Entering DFU Mode...",
+ "find_device_issue": "Can't find your device? Open an issue on",
+ "select_firmware": "2. Select firmware to flash (.zip)",
+ "flash_now": "Flash Now",
+ "flashing": "Flashing: {percentage}%",
+ "flashing_file_progress": "File {current}/{total}: {percentage}%",
+ "connecting_device": "Connecting to device...",
+ "download_firmware": "Download Firmware",
+ "official_firmware": "Official Firmware",
+ "ce_firmware": "CE Firmware",
+ "transport_node_firmware": "Transport Node Firmware",
+ "common_issues": "Common Issues",
+ "hardware_failure": "Hardware Failure:",
+ "provision_eeprom_hint": "You need to provision the eeprom in step 3.",
+ "firmware_corrupt": "Firmware Corrupt:",
+ "set_firmware_hash_hint": "You need to set the firmware hash in step 4.",
+ "step_provision": "3. Provision EEPROM",
+ "provision_description": "Sets device info, checksum and blank signature",
+ "provision": "Provision",
+ "provisioning_wait": "Provisioning: please wait...",
+ "step_set_hash": "4. Set Firmware Hash",
+ "set_hash_description": "Uses hash from board",
+ "set_firmware_hash": "Set Firmware Hash",
+ "setting_hash_wait": "Setting Firmware Hash: please wait...",
+ "step_done": "5. Finalize",
+ "download_recommended": "Download & Load Recommended Firmware",
+ "downloading": "Downloading...",
+ "done_description": "If you made it this far, and all previous steps were successful, your RNode should be ready to use.",
+ "meshchat_usage": "To use RNode with MeshChat, you will need to add an RNodeInterface in the Interfaces → Add Interface page.",
+ "sideband_usage": "To use RNode with Sideband, you will need to configure it in Hardware → RNode and enable Connectivity → Connect via RNode.",
+ "restart_warning": "You must restart MeshChat and Sideband for interface setting changes to take effect, otherwise nothing will happen!",
+ "advanced_tools": "Advanced Tools",
+ "detect_rnode": "Detect RNode",
+ "reboot_rnode": "Reboot RNode",
+ "read_display": "Read Display",
+ "dump_eeprom": "Dump EEPROM",
+ "wipe_eeprom": "Wipe EEPROM",
+ "eeprom_console_hint": "EEPROM dumps are shown in dev tools console.",
+ "configure_bluetooth": "Configure Bluetooth (optional)",
+ "bluetooth_info_1": "Bluetooth is not supported on all devices.",
+ "bluetooth_info_2": "Some devices use Bluetooth Classic, and some use BLE (Bluetooth Low Energy)",
+ "bluetooth_info_3": "Put the RNode into Bluetooth Pairing mode, then connect to it from Android Bluetooth settings.",
+ "bluetooth_info_4": "Once you have initiated a pair request from Android, a PIN should show on the RNode display.",
+ "bluetooth_info_5": "In Sideband you will need to enable Connect using Bluetooth in Hardware → RNode.",
+ "bluetooth_info_6": "If your device uses BLE you will also need to enable Device requires BLE in Hardware → RNode.",
+ "bluetooth_restart_warning": "Don't forget to restart Sideband for the setting changes to take effect!",
+ "enable": "Enable",
+ "disable": "Disable",
+ "start_pairing": "Start Pairing",
+ "configure_tnc": "Configure TNC Mode (optional)",
+ "tnc_info_1": "TNC mode allows an RNode to be used as a KISS compatible TNC over the Serial Port.",
+ "tnc_info_2": "This mode makes it usable with amateur radio software that can talk to a KISS TNC over a serial port.",
+ "tnc_warning": "You must leave TNC mode disabled when using RNode with apps like MeshChat or Sideband.",
+ "frequency": "Frequency (Hz)",
+ "bandwidth": "Bandwidth",
+ "tx_power": "Tx Power (dBm)",
+ "spreading_factor": "Spreading Factor",
+ "coding_rate": "Coding Rate",
+ "configure_display": "Configure Display",
+ "rotation": "Rotation",
+ "reconditioning": "Reconditioning",
+ "start": "Start",
+ "stop": "Stop",
+ "rotation_v180_warning": "Setting display rotation requires firmware v1.80+",
+ "errors": {
+ "failed_download": "Failed to download firmware: {error}",
+ "firmware_not_found_in_release": "Recommended firmware not found in the latest release.",
+ "web_serial_not_supported": "Web Serial is not supported in this browser. Please use Chrome, Edge, or another Chromium-based browser.",
+ "no_device_selected": "No device selected. Please select a serial port.",
+ "failed_connect": "Failed to connect to device: {error}",
+ "not_an_rnode": "Selected device is not an RNode! Please make sure you've selected the correct serial port.",
+ "failed_dfu": "Failed to enter DFU mode: {error}",
+ "select_firmware_first": "Please select a firmware file (.zip) first.",
+ "failed_flash": "Firmware flashing failed: {error}",
+ "esptool_not_loaded": "esptool-js could not be loaded. Please refresh the page and try again.",
+ "no_flash_config": "Flash configuration is not available for the selected device. Please select a different device or check the firmware file.",
+ "failed_extract": "Required file \"{file}\" not found in firmware ZIP file. Please download the correct firmware for your device.",
+ "failed_detect": "Failed to detect RNode. Make sure the device is connected and in the correct mode.",
+ "provisioned_already": "Eeprom is already provisioned. You must wipe it to reprovision!",
+ "select_product_first": "Please select a product!",
+ "select_model_first": "Please select a model!",
+ "not_provisioned": "Eeprom is not provisioned. You must do this first!",
+ "failed_provision": "failed to provision: {error}",
+ "failed_set_hash": "failed to set firmware hash: {error}",
+ "failed_reboot": "Failed to reboot RNode: {error}",
+ "failed_read_display": "Failed to read display: {error}",
+ "failed_dump_eeprom": "Failed to dump EEPROM: {error}",
+ "failed_wipe_eeprom": "Failed to wipe EEPROM: {error}",
+ "failed_enable_tnc": "Failed to enable TNC mode: {error}",
+ "failed_disable_tnc": "Failed to disable TNC mode: {error}",
+ "failed_enable_bluetooth": "Failed to enable Bluetooth: {error}",
+ "failed_disable_bluetooth": "Failed to disable Bluetooth: {error}",
+ "failed_start_pairing": "Failed to start pairing: {error}",
+ "failed_set_rotation": "Failed to set display rotation: {error}",
+ "failed_start_reconditioning": "Failed to start display reconditioning: {error}"
+ },
+ "alerts": {
+ "firmware_downloaded": "Recommended firmware has been downloaded and loaded.",
+ "dfu_ready": "Device should now be in DFU mode. You can now proceed with flashing firmware.",
+ "flash_success": "Firmware has been flashed successfully!",
+ "rebooting": "Board is rebooting!",
+ "eeprom_wipe_confirm": "Are you sure you want to wipe the eeprom on this device? This will take about 30 seconds. An alert will show when the eeprom wipe has finished.",
+ "eeprom_wiped": "eeprom has been wiped!",
+ "eeprom_dumped": "EEPROM dumped to console",
+ "rnode_detected": "RNode v{version} detected",
+ "provision_success": "device has been provisioned!",
+ "hash_success": "firmware hash has been set!",
+ "tnc_enabled": "TNC mode has been enabled!",
+ "tnc_disabled": "TNC mode has been disabled!",
+ "bluetooth_enabled": "Bluetooth has been enabled!",
+ "bluetooth_disabled": "Bluetooth has been disabled!",
+ "bluetooth_pairing_pin": "Bluetooth Pairing Pin: {pin}",
+ "bluetooth_pairing_started": "Pairing mode started (30s)",
+ "rotation_updated": "Rotation updated",
+ "reconditioning_started": "Reconditioning started"
+ }
},
"micron_editor": {
"title": "Micron Editor",
@@ -536,7 +658,9 @@
"rename_tab": "Rename Tab",
"confirm_reset": "Are you sure you want to reset the editor? All your tabs and content will be lost.",
"confirm_delete_tab": "Are you sure you want to delete this tab?",
- "main_tab": "Main"
+ "main_tab": "Main",
+ "guide_tab": "NomadNet Guide",
+ "parser_by": "Using Micron Parser by"
},
"paper_message": {
"title": "Paper Message",
@@ -707,6 +831,7 @@
"unknown": "Unknown",
"call_ended": "Call Ended",
"call_declined": "Call Declined",
+ "initiation": "Initiating...",
"send_to_voicemail": "Send to Voicemail",
"incoming_call": "Incoming Call...",
"busy": "Busy...",
@@ -820,31 +945,132 @@
"failed_to_play_ringtone": "Failed to play ringtone",
"failed_to_play_voicemail": "Failed to play voicemail"
},
+ "tutorial": {
+ "title": "Getting Started",
+ "welcome": "Welcome to",
+ "welcome_desc": "The future of off-grid communication. Secure, decentralized, and unstoppable.",
+ "security": "Security & Performance",
+ "security_desc": "Massive improvements in speed, security, and crash recovery.",
+ "security_desc_page": "Massive improvements in speed, security, and integrity with built-in crash recovery.",
+ "maps": "Maps",
+ "maps_desc": "OpenLayers w/ MBTiles support (export and offline support) and custom API endpoints.",
+ "maps_desc_page": "OpenLayers support with offline MBTiles (export and offline support) and custom API endpoints for online maps.",
+ "voice": "Full LXST Voice",
+ "voice_desc": "Voicemail, ringtones, phonebook, and contact sharing.",
+ "voice_desc_page": "Crystal clear voice calls over mesh. Voicemail, custom ringtones, and phonebook discovery.",
+ "tools": "Advanced Tools",
+ "tools_desc": "Micron Editor, NomadNet, RNS tools, Docs.",
+ "tools_desc_page": "Micron editor, NomadNet nodes, RNS tools, and integrated documentation.",
+ "archiver": "Archiver",
+ "archiver_desc": "Manual and Automated page archiving.",
+ "archiver_desc_page": "Manual and Automated page archiving tools for offline browsing.",
+ "banishment": "Banishment",
+ "banishment_desc": "Banish annoying people, nodes and support for RNS blackhole level dropping their announces",
+ "palette": "Command Palette + Keybindings",
+ "palette_desc": "Navigate everything instantly and customize shortcuts.",
+ "palette_desc_page": "Navigate the entire application and customize your workflow with instant shortcuts.",
+ "i18n": "i18n Support",
+ "i18n_desc": "Available in English, German, and Russian.",
+ "i18n_desc_page": "Full internationalization support for English, German, and Russian languages.",
+ "more_features": "+ many more features!",
+ "connect": "Connect to the Mesh",
+ "connect_desc": "To send messages, you need to connect to a Reticulum interface.",
+ "connect_desc_page": "Use one of the public networks below or add a custom interface from the Interfaces page.",
+ "suggested_networks": "Suggested Public Networks",
+ "suggested_relays": "Suggested Relays",
+ "use": "Use",
+ "online": "Online",
+ "custom_interfaces": "Custom Interfaces",
+ "custom_interfaces_desc": "Want to add a bespoke interface? Head to the Interfaces page to configure a custom connection.",
+ "custom_interfaces_desc_page": "For any private relays or hardware you manage yourself, add them through the dedicated Interfaces page.",
+ "open_interfaces": "Open Interfaces page",
+ "learn_create": "Learn & Create",
+ "learn_create_desc": "Discover how to use MeshChatX to its full potential.",
+ "learn_create_desc_page": "Discover how to use MeshChatX to its full potential and create your own content.",
+ "documentation": "Documentation",
+ "documentation_desc": "Read the official MeshChatX and Reticulum documentation.",
+ "documentation_desc_page": "Comprehensive guides for MeshChatX and the underlying Reticulum Network Stack.",
+ "meshchatx_docs": "MeshChatX Docs",
+ "reticulum_docs": "Reticulum Docs",
+ "read_meshchatx_docs": "Read MeshChatX Docs",
+ "reticulum_manual": "Reticulum Network Manual",
+ "micron_editor": "Micron Editor",
+ "micron_editor_desc": "Take a look at the Micron Editor for a guide on creating mesh-native pages.",
+ "micron_editor_desc_page": "Learn how to create mesh-native pages and interactive content using the Micron markup language.",
+ "open_micron_editor": "Open Micron Editor",
+ "paper_messages": "Explore NomadNet Nodes",
+ "paper_messages_desc": "Browse decentralized pages and services.",
+ "send_messages": "Send Messages",
+ "send_messages_desc": "Start a secure conversation.",
+ "explore_nodes": "Visualize Nodes",
+ "explore_nodes_desc": "View the network map and topology.",
+ "voice_calls": "Voice Calls",
+ "voice_calls_desc": "Check out the awesome ringtone editor!",
+ "ready": "Ready to Roll!",
+ "ready_desc": "Everything is set up. You need to restart the application for the changes to take effect.",
+ "ready_desc_page": "MeshChatX is now configured. You need to restart the application to finalize the connection.",
+ "docker_note": "If you're running in Docker, make sure you restart the container",
+ "restart_required": "Restart Required",
+ "restart_desc_page": "If you're running in Docker, ensure you restart the container. Native apps will relaunch automatically.",
+ "back": "Back",
+ "skip": "Skip",
+ "next": "Next",
+ "restart_start": "Start MeshChatX",
+ "skip_setup": "Skip Setup",
+ "continue": "Continue",
+ "skip_confirm": "Are you sure you want to skip the setup? You'll need to manually add interfaces later."
+ },
"command_palette": {
- "search_placeholder": "Search or type a command...",
+ "search_placeholder": "Search commands, navigate, or find peers...",
"no_results": "No results found for \"{query}\"",
- "nav_messages": "Go to Messages",
- "nav_messages_desc": "Open your recent conversations",
- "nav_nomad": "Go to Nomad Network",
- "nav_nomad_desc": "Browse the distributed web",
- "nav_map": "Go to Map",
- "nav_map_desc": "View peer locations and telemetry",
- "nav_paper": "Paper Message Generator",
- "nav_paper_desc": "Generate signed QR code messages",
- "nav_call": "Go to Calls",
- "nav_call_desc": "Voice calls and voicemails",
- "nav_settings": "Go to Settings",
- "nav_settings_desc": "App configuration and preferences",
- "action_sync": "Sync Messages",
- "action_sync_desc": "Request messages from propagation node",
- "action_compose": "Compose New Message",
- "action_compose_desc": "Start a new chat by address",
- "action_orbit": "Orbit Mode",
- "action_orbit_desc": "Toggle space orbit visualization",
- "group_recent": "Recent Conversations",
+ "group_actions": "Actions",
+ "group_recent": "Recent Peers",
"group_contacts": "Contacts",
- "group_actions": "Quick Actions",
"footer_navigate": "Navigate",
- "footer_select": "Select"
+ "footer_select": "Select",
+ "nav_messages": "Messages",
+ "nav_messages_desc": "Open messages page",
+ "nav_nomad": "Nomad Network",
+ "nav_nomad_desc": "Browse Nomad Network pages",
+ "nav_map": "Map",
+ "nav_map_desc": "View network topology map",
+ "nav_paper": "Paper Messages",
+ "nav_paper_desc": "Generate offline messages",
+ "nav_call": "Voice Calls",
+ "nav_call_desc": "Open voice calls page",
+ "nav_settings": "Settings",
+ "nav_settings_desc": "Open settings page",
+ "nav_ping": "Ping",
+ "nav_ping_desc": "Ping network nodes",
+ "nav_rnprobe": "RN Probe",
+ "nav_rnprobe_desc": "Probe Reticulum nodes",
+ "nav_rncp": "RN CP",
+ "nav_rncp_desc": "Reticulum Control Protocol",
+ "nav_rnstatus": "RN Status",
+ "nav_rnstatus_desc": "View Reticulum status",
+ "nav_rnpath": "RN Path",
+ "nav_rnpath_desc": "View network paths",
+ "nav_translator": "Translator",
+ "nav_translator_desc": "Translate messages",
+ "nav_forwarder": "Forwarder",
+ "nav_forwarder_desc": "Message forwarding tool",
+ "nav_documentation": "Documentation",
+ "nav_documentation_desc": "View documentation",
+ "nav_micron_editor": "Micron Editor",
+ "nav_micron_editor_desc": "Create mesh-native pages",
+ "nav_rnode_flasher": "RNode Flasher",
+ "nav_rnode_flasher_desc": "Flash RNode firmware",
+ "nav_debug_logs": "Debug Logs",
+ "nav_debug_logs_desc": "View debug logs",
+ "action_sync": "Sync Messages",
+ "action_sync_desc": "Sync with propagation node",
+ "action_compose": "Compose Message",
+ "action_compose_desc": "Start a new message",
+ "action_orbit": "Toggle Orbit",
+ "action_orbit_desc": "Toggle orbit mode",
+ "action_getting_started": "Getting Started",
+ "action_getting_started_desc": "Show getting started guide",
+ "action_changelog": "Changelog",
+ "action_changelog_desc": "View what's new"
}
}
diff --git a/meshchatx/src/frontend/locales/ru.json b/meshchatx/src/frontend/locales/ru.json
index 5bfacf03..e1db5aec 100644
--- a/meshchatx/src/frontend/locales/ru.json
+++ b/meshchatx/src/frontend/locales/ru.json
@@ -520,7 +520,129 @@
},
"rnode_flasher": {
"title": "RNode Flasher",
- "description": "Прошивка и обновление адаптеров RNode без использования командной строки."
+ "description": "Прошивка и обновление адаптеров RNode без использования командной строки.",
+ "select_device": "1. Выберите устройство",
+ "product": "Продукт",
+ "model": "Модель",
+ "select_product": "Выберите продукт",
+ "select_model": "Выберите модель",
+ "enter_dfu_mode": "Войти в режим DFU",
+ "entering_dfu_mode": "Вход в режим DFU...",
+ "find_device_issue": "Не удается найти устройство? Откройте обращение на",
+ "select_firmware": "2. Выберите прошивку для установки (.zip)",
+ "flash_now": "Прошить сейчас",
+ "flashing": "Прошивка: {percentage}%",
+ "flashing_file_progress": "Файл {current}/{total}: {percentage}%",
+ "connecting_device": "Подключение к устройству...",
+ "download_firmware": "Скачать прошивку",
+ "official_firmware": "Официальная прошивка",
+ "ce_firmware": "CE прошивка",
+ "transport_node_firmware": "Прошивка транспортного узла",
+ "common_issues": "Общие проблемы",
+ "hardware_failure": "Аппаратный сбой:",
+ "provision_eeprom_hint": "Вам необходимо подготовить EEPROM на шаге 3.",
+ "firmware_corrupt": "Прошивка повреждена:",
+ "set_firmware_hash_hint": "Вам необходимо установить хеш прошивки на шаге 4.",
+ "step_provision": "3. Подготовка EEPROM",
+ "provision_description": "Устанавливает информацию об устройстве, контрольную сумму и пустую подпись",
+ "provision": "Подготовить",
+ "provisioning_wait": "Подготовка: пожалуйста, подождите...",
+ "step_set_hash": "4. Установить хеш прошивки",
+ "set_hash_description": "Использует хеш с платы",
+ "set_firmware_hash": "Установить хеш прошивки",
+ "setting_hash_wait": "Установка хеша прошивки: пожалуйста, подождите...",
+ "step_done": "5. Завершение",
+ "download_recommended": "Скачать и загрузить рекомендуемую прошивку",
+ "downloading": "Загрузка...",
+ "done_description": "Если вы дошли до этого момента и все предыдущие шаги были успешны, ваш RNode должен быть готов к использованию.",
+ "meshchat_usage": "Чтобы использовать RNode с MeshChat, вам нужно добавить RNodeInterface на странице Интерфейсы → Добавить интерфейс.",
+ "sideband_usage": "Чтобы использовать RNode с Sideband, вам нужно настроить его в Оборудование → RNode и включить Подключение → Подключиться через RNode.",
+ "restart_warning": "Вы должны перезапустить MeshChat и Sideband, чтобы изменения настроек интерфейса вступили в силу, иначе ничего не произойдет!",
+ "advanced_tools": "Расширенные инструменты",
+ "detect_rnode": "Определить RNode",
+ "reboot_rnode": "Перезагрузить RNode",
+ "read_display": "Прочитать дисплей",
+ "dump_eeprom": "Дамп EEPROM",
+ "wipe_eeprom": "Очистить EEPROM",
+ "eeprom_console_hint": "Дампы EEPROM отображаются в консоли инструментов разработчика.",
+ "configure_bluetooth": "Настройка Bluetooth (опционально)",
+ "bluetooth_info_1": "Bluetooth поддерживается не на всех устройствах.",
+ "bluetooth_info_2": "Некоторые устройства используют Bluetooth Classic, а некоторые — BLE (Bluetooth Low Energy).",
+ "bluetooth_info_3": "Переведите RNode в режим сопряжения Bluetooth, затем подключитесь к нему в настройках Bluetooth Android.",
+ "bluetooth_info_4": "После инициирования запроса на сопряжение из Android, PIN-код должен отобразиться на экране RNode.",
+ "bluetooth_info_5": "В Sideband вам нужно включить 'Подключиться через Bluetooth' в Оборудование → RNode.",
+ "bluetooth_info_6": "Если ваше устройство использует BLE, вам также нужно включить 'Устройству требуется BLE' в Оборудование → RNode.",
+ "bluetooth_restart_warning": "Не забудьте перезапустить Sideband, чтобы изменения настроек вступили в силу!",
+ "enable": "Включить",
+ "disable": "Выключить",
+ "start_pairing": "Начать сопряжение",
+ "configure_tnc": "Настройка режима TNC (опционально)",
+ "tnc_info_1": "Режим TNC позволяет использовать RNode как KISS-совместимый TNC через последовательный порт.",
+ "tnc_info_2": "Этот режим делает его пригодным для использования с ПО для радиолюбителей, которое может работать с KISS TNC через последовательный порт.",
+ "tnc_warning": "Вы должны оставить режим TNC отключенным при использовании RNode с приложениями вроде MeshChat или Sideband.",
+ "frequency": "Частота (Гц)",
+ "bandwidth": "Полоса пропускания",
+ "tx_power": "Мощность передачи (дБм)",
+ "spreading_factor": "Коэффициент расширения",
+ "coding_rate": "Скорость кодирования",
+ "configure_display": "Настройка дисплея",
+ "rotation": "Поворот",
+ "reconditioning": "Восстановление",
+ "start": "Старт",
+ "stop": "Стоп",
+ "rotation_v180_warning": "Настройка поворота дисплея требует прошивки v1.80+",
+ "errors": {
+ "failed_download": "Не удалось скачать прошивку: {error}",
+ "firmware_not_found_in_release": "Рекомендуемая прошивка не найдена в последнем выпуске.",
+ "web_serial_not_supported": "Web Serial не поддерживается в этом браузере. Пожалуйста, используйте Chrome, Edge или другой браузер на базе Chromium.",
+ "no_device_selected": "Устройство не выбрано. Пожалуйста, выберите последовательный порт.",
+ "failed_connect": "Не удалось подключиться к устройству: {error}",
+ "not_an_rnode": "Выбранное устройство не является RNode! Убедитесь, что вы выбрали правильный последовательный порт.",
+ "failed_dfu": "Не удалось войти в режим DFU: {error}",
+ "select_firmware_first": "Пожалуйста, сначала выберите файл прошивки (.zip).",
+ "failed_flash": "Сбой прошивки: {error}",
+ "esptool_not_loaded": "esptool-js не удалось загрузить. Пожалуйста, обновите страницу и попробуйте снова.",
+ "no_flash_config": "Конфигурация прошивки недоступна для выбранного устройства. Выберите другое устройство или проверьте файл прошивки.",
+ "failed_extract": "Требуемый файл \"{file}\" не найден в ZIP-архиве прошивки. Скачайте правильную прошивку для вашего устройства.",
+ "failed_detect": "Не удалось обнаружить RNode. Убедитесь, что устройство подключено и находится в правильном режиме.",
+ "provisioned_already": "EEPROM уже подготовлен. Вам нужно очистить его для повторной подготовки!",
+ "select_product_first": "Пожалуйста, сначала выберите продукт!",
+ "select_model_first": "Пожалуйста, сначала выберите модель!",
+ "not_provisioned": "EEPROM не подготовлен. Вы должны сделать это в первую очередь!",
+ "failed_provision": "не удалось подготовить: {error}",
+ "failed_set_hash": "не удалось установить хеш прошивки: {error}",
+ "failed_reboot": "Не удалось перезагрузить RNode: {error}",
+ "failed_read_display": "Не удалось прочитать дисплей: {error}",
+ "failed_dump_eeprom": "Не удалось выполнить дамп EEPROM: {error}",
+ "failed_wipe_eeprom": "Не удалось очистить EEPROM: {error}",
+ "failed_enable_tnc": "Не удалось включить режим TNC: {error}",
+ "failed_disable_tnc": "Не удалось выключить режим TNC: {error}",
+ "failed_enable_bluetooth": "Не удалось включить Bluetooth: {error}",
+ "failed_disable_bluetooth": "Не удалось выключить Bluetooth: {error}",
+ "failed_start_pairing": "Не удалось начать сопряжение: {error}",
+ "failed_set_rotation": "Не удалось установить поворот дисплея: {error}",
+ "failed_start_reconditioning": "Не удалось запустить восстановление дисплея: {error}"
+ },
+ "alerts": {
+ "firmware_downloaded": "Рекомендуемая прошивка была скачана и загружена.",
+ "dfu_ready": "Устройство должно находиться в режиме DFU. Теперь вы можете продолжить прошивку.",
+ "flash_success": "Прошивка успешно завершена!",
+ "rebooting": "Плата перезагружается!",
+ "eeprom_wipe_confirm": "Вы уверены, что хотите очистить EEPROM на этом устройстве? Это займет около 30 секунд. Уведомление появится после завершения очистки.",
+ "eeprom_wiped": "EEPROM очищен!",
+ "eeprom_dumped": "Дамп EEPROM выведен в консоль",
+ "rnode_detected": "Обнаружен RNode v{version}",
+ "provision_success": "устройство подготовлено!",
+ "hash_success": "хеш прошивки установлен!",
+ "tnc_enabled": "Режим TNC включен!",
+ "tnc_disabled": "Режим TNC выключен!",
+ "bluetooth_enabled": "Bluetooth включен!",
+ "bluetooth_disabled": "Bluetooth выключен!",
+ "bluetooth_pairing_pin": "PIN-код сопряжения Bluetooth: {pin}",
+ "bluetooth_pairing_started": "Режим сопряжения запущен (30с)",
+ "rotation_updated": "Поворот обновлен",
+ "reconditioning_started": "Восстановление запущено"
+ }
},
"micron_editor": {
"title": "Редактор Micron",
@@ -536,7 +658,9 @@
"rename_tab": "Переименовать вкладку",
"confirm_reset": "Вы уверены, что хотите сбросить редактор? Все ваши вкладки и содержимое будут потеряны.",
"confirm_delete_tab": "Вы уверены, что хотите удалить эту вкладку?",
- "main_tab": "Основная"
+ "main_tab": "Основная",
+ "guide_tab": "Руководство NomadNet",
+ "parser_by": "Micron Parser от"
},
"paper_message": {
"title": "Бумажное сообщение",
@@ -707,6 +831,7 @@
"unknown": "Неизвестно",
"call_ended": "Звонок завершен",
"call_declined": "Звонок отклонен",
+ "initiation": "Инициализация...",
"send_to_voicemail": "На голосовую почту",
"incoming_call": "Входящий звонок...",
"busy": "Занято...",
@@ -820,31 +945,132 @@
"failed_to_play_ringtone": "Не удалось воспроизвести рингтон",
"failed_to_play_voicemail": "Не удалось воспроизвести сообщение"
},
+ "tutorial": {
+ "title": "Начало работы",
+ "welcome": "Добро пожаловать в",
+ "welcome_desc": "Будущее внесетевой связи. Безопасно, децентрализовано и неостановимо.",
+ "security": "Безопасность и производительность",
+ "security_desc": "Значительные улучшения скорости, безопасности и восстановления после сбоев.",
+ "security_desc_page": "Значительные улучшения скорости, безопасности и целостности со встроенным восстановлением после сбоев.",
+ "maps": "Карты",
+ "maps_desc": "OpenLayers с поддержкой MBTiles (экспорт и офлайн) и пользовательскими API-точками.",
+ "maps_desc_page": "Поддержка OpenLayers с офлайн MBTiles (экспорт и офлайн) и пользовательскими API-точками для онлайн-карт.",
+ "voice": "Полный голос LXST",
+ "voice_desc": "Голосовая почта, рингтоны, телефонная книга и обмен контактами.",
+ "voice_desc_page": "Кристально чистые голосовые звонки через mesh. Голосовая почта, свои рингтоны и поиск в телефонной книге.",
+ "tools": "Продвинутые инструменты",
+ "tools_desc": "Редактор Micron, NomadNet, инструменты RNS, Документация.",
+ "tools_desc_page": "Редактор Micron, узлы NomadNet, инструменты RNS и встроенная документация.",
+ "archiver": "Архиватор",
+ "archiver_desc": "Ручное и автоматическое архивирование страниц.",
+ "archiver_desc_page": "Инструменты ручного и автоматического архивирования страниц для офлайн-просмотра.",
+ "banishment": "Изгнание",
+ "banishment_desc": "Изгоняйте надоедливых людей и узлы, поддержка блокировки анонсов на уровне RNS blackhole.",
+ "palette": "Командная палитра + горячие клавиши",
+ "palette_desc": "Мгновенная навигация и настройка горячих клавиш.",
+ "palette_desc_page": "Навигация по всему приложению и настройка рабочего процесса с помощью мгновенных горячих клавиш.",
+ "i18n": "Поддержка i18n",
+ "i18n_desc": "Доступно на английском, немецком и русском языках.",
+ "i18n_desc_page": "Полная поддержка интернационализации для английского, немецкого и русского языков.",
+ "more_features": "+ еще много функций!",
+ "connect": "Подключение к Mesh",
+ "connect_desc": "Для отправки сообщений необходимо подключиться к интерфейсу Reticulum.",
+ "connect_desc_page": "Используйте одну из общедоступных сетей ниже или добавьте свой интерфейс на странице 'Интерфейсы'.",
+ "suggested_networks": "Предлагаемые публичные сети",
+ "suggested_relays": "Предлагаемые реле",
+ "use": "Использовать",
+ "online": "В сети",
+ "custom_interfaces": "Свои интерфейсы",
+ "custom_interfaces_desc": "Хотите добавить свой интерфейс? Перейдите на страницу 'Интерфейсы' для настройки подключения.",
+ "custom_interfaces_desc_page": "Для любых частных реле или оборудования, которыми вы управляете сами, добавьте их через страницу 'Интерфейсы'.",
+ "open_interfaces": "Открыть страницу интерфейсов",
+ "learn_create": "Обучение и создание",
+ "learn_create_desc": "Узнайте, как использовать MeshChatX на полную мощность.",
+ "learn_create_desc_page": "Узнайте, как использовать MeshChatX на полную мощность и создавать свой контент.",
+ "documentation": "Документация",
+ "documentation_desc": "Читайте официальную документацию MeshChatX и Reticulum.",
+ "documentation_desc_page": "Подробные руководства по MeshChatX и базовому стеку Reticulum Network.",
+ "meshchatx_docs": "Документация MeshChatX",
+ "reticulum_docs": "Документация Reticulum",
+ "read_meshchatx_docs": "Читать документацию MeshChatX",
+ "reticulum_manual": "Руководство Reticulum",
+ "micron_editor": "Редактор Micron",
+ "micron_editor_desc": "Загляните в редактор Micron, чтобы узнать, как создавать mesh-страницы.",
+ "micron_editor_desc_page": "Узнайте, как создавать mesh-страницы и интерактивный контент с помощью языка разметки Micron.",
+ "open_micron_editor": "Открыть редактор Micron",
+ "paper_messages": "Обзор узлов NomadNet",
+ "paper_messages_desc": "Просмотр децентрализованных страниц и сервисов.",
+ "send_messages": "Отправка сообщений",
+ "send_messages_desc": "Начните защищенный разговор.",
+ "explore_nodes": "Визуализация узлов",
+ "explore_nodes_desc": "Просмотр карты и топологии сети.",
+ "voice_calls": "Голосовые звонки",
+ "voice_calls_desc": "Посмотрите наш крутой редактор рингтонов!",
+ "ready": "Все готово!",
+ "ready_desc": "Все настроено. Вам нужно перезапустить приложение, чтобы изменения вступили в силу.",
+ "ready_desc_page": "MeshChatX настроен. Вам нужно перезапустить приложение для завершения подключения.",
+ "docker_note": "Если вы используете Docker, обязательно перезапустите контейнер",
+ "restart_required": "Требуется перезапуск",
+ "restart_desc_page": "Если вы используете Docker, обязательно перезапустите контейнер. Нативные приложения перезапустятся автоматически.",
+ "back": "Назад",
+ "skip": "Пропустить",
+ "next": "Далее",
+ "restart_start": "Запустить MeshChatX",
+ "skip_setup": "Пропустить настройку",
+ "continue": "Продолжить",
+ "skip_confirm": "Вы уверены, что хотите пропустить настройку? Вам придется добавить интерфейсы позже вручную."
+ },
"command_palette": {
- "search_placeholder": "Поиск или ввод команды...",
- "no_results": "Ничего не найдено по запросу \"{query}\"",
- "nav_messages": "Перейти к сообщениям",
- "nav_messages_desc": "Открыть недавние разговоры",
- "nav_nomad": "Перейти в Nomad Network",
- "nav_nomad_desc": "Просмотр распределенной сети",
- "nav_map": "Перейти к карте",
- "nav_map_desc": "Просмотр местоположения и телеметрии",
- "nav_paper": "Генератор бумажных сообщений",
- "nav_paper_desc": "Создание подписанных QR-кодов",
- "nav_call": "Перейти к звонкам",
- "nav_call_desc": "Голосовые звонки и голосовая почта",
- "nav_settings": "Перейти к настройкам",
- "nav_settings_desc": "Конфигурация и настройки приложения",
- "action_sync": "Синхронизировать сообщения",
- "action_sync_desc": "Запросить сообщения с узла",
- "action_compose": "Написать новое сообщение",
- "action_compose_desc": "Начать новый чат по адресу",
- "action_orbit": "Режим орбиты",
- "action_orbit_desc": "Визуализация космической орбиты",
- "group_recent": "Недавние разговоры",
+ "search_placeholder": "Поиск команд, навигация или поиск узлов...",
+ "no_results": "Результатов для \"{query}\" не найдено",
+ "group_actions": "Действия",
+ "group_recent": "Недавние узлы",
"group_contacts": "Контакты",
- "group_actions": "Быстрые действия",
"footer_navigate": "Навигация",
- "footer_select": "Выбрать"
+ "footer_select": "Выбор",
+ "nav_messages": "Сообщения",
+ "nav_messages_desc": "Открыть страницу сообщений",
+ "nav_nomad": "Nomad Network",
+ "nav_nomad_desc": "Просмотр страниц Nomad Network",
+ "nav_map": "Карта",
+ "nav_map_desc": "Просмотр карты топологии сети",
+ "nav_paper": "Бумажные сообщения",
+ "nav_paper_desc": "Создание офлайн-сообщений",
+ "nav_call": "Голосовые звонки",
+ "nav_call_desc": "Открыть страницу голосовых звонков",
+ "nav_settings": "Настройки",
+ "nav_settings_desc": "Открыть страницу настроек",
+ "nav_ping": "Ping",
+ "nav_ping_desc": "Пинг узлов сети",
+ "nav_rnprobe": "RN Probe",
+ "nav_rnprobe_desc": "Зондирование узлов Reticulum",
+ "nav_rncp": "RN CP",
+ "nav_rncp_desc": "Reticulum Control Protocol",
+ "nav_rnstatus": "RN Status",
+ "nav_rnstatus_desc": "Просмотр статуса Reticulum",
+ "nav_rnpath": "RN Path",
+ "nav_rnpath_desc": "Просмотр сетевых путей",
+ "nav_translator": "Переводчик",
+ "nav_translator_desc": "Перевод сообщений",
+ "nav_forwarder": "Форвардер",
+ "nav_forwarder_desc": "Инструмент пересылки сообщений",
+ "nav_documentation": "Документация",
+ "nav_documentation_desc": "Просмотр документации",
+ "nav_micron_editor": "Редактор Micron",
+ "nav_micron_editor_desc": "Создание mesh-страниц",
+ "nav_rnode_flasher": "RNode Flasher",
+ "nav_rnode_flasher_desc": "Прошивка адаптеров RNode",
+ "nav_debug_logs": "Логи отладки",
+ "nav_debug_logs_desc": "Просмотр логов отладки",
+ "action_sync": "Синхронизация",
+ "action_sync_desc": "Синхронизация с узлом ретрансляции",
+ "action_compose": "Написать сообщение",
+ "action_compose_desc": "Начать новое сообщение",
+ "action_orbit": "Переключить Orbit",
+ "action_orbit_desc": "Переключить режим Orbit",
+ "action_getting_started": "Начало работы",
+ "action_getting_started_desc": "Показать руководство",
+ "action_changelog": "Список изменений",
+ "action_changelog_desc": "Просмотр изменений"
}
}
diff --git a/package.json b/package.json
index 842e8c44..d3abdb2b 100644
--- a/package.json
+++ b/package.json
@@ -49,8 +49,10 @@
"@electron/fuses": "^1.8.0",
"@eslint/js": "^9.39.2",
"@rushstack/eslint-patch": "^1.15.0",
+ "@tailwindcss/typography": "^0.5.19",
"@vue/eslint-config-prettier": "^10.2.0",
"@vue/test-utils": "^2.4.6",
+ "autoprefixer": "^10.4.23",
"electron": "^39.2.7",
"electron-builder": "^26.0.12",
"electron-builder-squirrel-windows": "^26.0.12",
@@ -61,7 +63,9 @@
"eslint-plugin-vue": "^10.6.2",
"globals": "^16.5.0",
"jsdom": "^26.1.0",
+ "postcss": "^8.5.6",
"prettier": "^3.7.4",
+ "tailwindcss": "^3.4.19",
"terser": "^5.44.1",
"vitest": "^3.2.4"
},
@@ -71,7 +75,10 @@
"electron-winstaller",
"esbuild",
"protobufjs"
- ]
+ ],
+ "overrides": {
+ "tmp": ">=0.2.4"
+ }
},
"build": {
"appId": "com.sudoivan.reticulummeshchat",
@@ -190,7 +197,6 @@
"@mdi/js": "^7.4.47",
"@tailwindcss/forms": "^0.5.11",
"@vitejs/plugin-vue": "^5.2.4",
- "autoprefixer": "^10.4.23",
"axios": "^1.13.2",
"click-outside-vue3": "^4.0.1",
"compressorjs": "^1.2.1",
@@ -200,10 +206,8 @@
"micron-parser": "^1.0.2",
"mitt": "^3.0.1",
"ol": "^10.7.0",
- "postcss": "^8.5.6",
"protobufjs": "^7.5.4",
"qrcode": "^1.5.4",
- "tailwindcss": "^3.4.19",
"vis-data": "^7.1.10",
"vis-network": "^9.1.13",
"vite": "^6.4.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b8623cc8..7131a073 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -4,6 +4,9 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
+overrides:
+ tmp: '>=0.2.4'
+
importers:
.:
@@ -20,9 +23,6 @@ importers:
'@vitejs/plugin-vue':
specifier: ^5.2.4
version: 5.2.4(vite@6.4.1(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
- autoprefixer:
- specifier: ^10.4.23
- version: 10.4.23(postcss@8.5.6)
axios:
specifier: ^1.13.2
version: 1.13.2
@@ -50,18 +50,12 @@ importers:
ol:
specifier: ^10.7.0
version: 10.7.0
- postcss:
- specifier: ^8.5.6
- version: 8.5.6
protobufjs:
specifier: ^7.5.4
version: 7.5.4
qrcode:
specifier: ^1.5.4
version: 1.5.4
- tailwindcss:
- specifier: ^3.4.19
- version: 3.4.19
vis-data:
specifier: ^7.1.10
version: 7.1.10(uuid@11.1.0)(vis-util@5.0.7(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0))
@@ -123,12 +117,18 @@ importers:
'@rushstack/eslint-patch':
specifier: ^1.15.0
version: 1.15.0
+ '@tailwindcss/typography':
+ specifier: ^0.5.19
+ version: 0.5.19(tailwindcss@3.4.19)
'@vue/eslint-config-prettier':
specifier: ^10.2.0
version: 10.2.0(@types/eslint@9.6.1)(eslint@9.39.2(jiti@1.21.7))(prettier@3.7.4)
'@vue/test-utils':
specifier: ^2.4.6
version: 2.4.6
+ autoprefixer:
+ specifier: ^10.4.23
+ version: 10.4.23(postcss@8.5.6)
electron:
specifier: ^39.2.7
version: 39.2.7
@@ -159,9 +159,15 @@ importers:
jsdom:
specifier: ^26.1.0
version: 26.1.0
+ postcss:
+ specifier: ^8.5.6
+ version: 8.5.6
prettier:
specifier: ^3.7.4
version: 3.7.4
+ tailwindcss:
+ specifier: ^3.4.19
+ version: 3.4.19
terser:
specifier: ^5.44.1
version: 5.44.1
@@ -925,6 +931,11 @@ packages:
peerDependencies:
tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1'
+ '@tailwindcss/typography@0.5.19':
+ resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
+
'@tootallnate/once@2.0.0':
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
engines: {node: '>= 10'}
@@ -2745,10 +2756,6 @@ packages:
resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
engines: {node: '>=10'}
- os-tmpdir@1.0.2:
- resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
- engines: {node: '>=0.10.0'}
-
p-cancelable@2.1.1:
resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
engines: {node: '>=8'}
@@ -2941,6 +2948,10 @@ packages:
peerDependencies:
postcss: ^8.2.14
+ postcss-selector-parser@6.0.10:
+ resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+ engines: {node: '>=4'}
+
postcss-selector-parser@6.1.2:
resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
engines: {node: '>=4'}
@@ -3442,10 +3453,6 @@ packages:
tmp-promise@3.0.3:
resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==}
- tmp@0.0.33:
- resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
- engines: {node: '>=0.6.0'}
-
tmp@0.2.5:
resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==}
engines: {node: '>=14.14'}
@@ -4831,6 +4838,11 @@ snapshots:
mini-svg-data-uri: 1.4.4
tailwindcss: 3.4.19
+ '@tailwindcss/typography@0.5.19(tailwindcss@3.4.19)':
+ dependencies:
+ postcss-selector-parser: 6.0.10
+ tailwindcss: 3.4.19
+
'@tootallnate/once@2.0.0': {}
'@types/cacheable-request@6.0.3':
@@ -6045,7 +6057,7 @@ snapshots:
dependencies:
chardet: 0.7.0
iconv-lite: 0.4.24
- tmp: 0.0.33
+ tmp: 0.2.5
extract-zip@2.0.1:
dependencies:
@@ -6923,8 +6935,6 @@ snapshots:
strip-ansi: 6.0.1
wcwidth: 1.0.1
- os-tmpdir@1.0.2: {}
-
p-cancelable@2.1.1: {}
p-defer@1.0.0: {}
@@ -7064,6 +7074,11 @@ snapshots:
postcss: 8.5.6
postcss-selector-parser: 6.1.2
+ postcss-selector-parser@6.0.10:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
postcss-selector-parser@6.1.2:
dependencies:
cssesc: 3.0.0
@@ -7597,10 +7612,6 @@ snapshots:
dependencies:
tmp: 0.2.5
- tmp@0.0.33:
- dependencies:
- os-tmpdir: 1.0.2
-
tmp@0.2.5: {}
to-regex-range@5.0.1:
diff --git a/tests/backend/test_blackhole_logic.py b/tests/backend/test_blackhole_logic.py
index 8ffadc52..a9be6cac 100644
--- a/tests/backend/test_blackhole_logic.py
+++ b/tests/backend/test_blackhole_logic.py
@@ -5,7 +5,6 @@ import json
from unittest.mock import MagicMock, patch, AsyncMock
from meshchatx.meshchat import ReticulumMeshChat
import RNS
-import asyncio
@pytest.fixture
diff --git a/tests/backend/test_rnpath_logic.py b/tests/backend/test_rnpath_logic.py
index 9f002869..33e6175a 100644
--- a/tests/backend/test_rnpath_logic.py
+++ b/tests/backend/test_rnpath_logic.py
@@ -14,7 +14,7 @@ def temp_dir(tmp_path):
def mock_rns_minimal():
with (
patch("RNS.Reticulum") as mock_rns,
- patch("RNS.Transport"),
+ patch("RNS.Transport") as mock_transport,
patch("LXMF.LXMRouter"),
patch("meshchatx.meshchat.get_file_path", return_value="/tmp/mock_path"),
):
@@ -23,6 +23,13 @@ def mock_rns_minimal():
mock_rns_instance.is_connected_to_shared_instance = False
mock_rns_instance.transport_enabled.return_value = True
+ # Setup RNS.Transport mock constants and tables
+ mock_transport.path_table = {}
+ mock_transport.path_states = {}
+ mock_transport.STATE_UNKNOWN = 0
+ mock_transport.STATE_RESPONSIVE = 1
+ mock_transport.STATE_UNRESPONSIVE = 2
+
# Path management mocks
mock_rns_instance.get_path_table.return_value = []
mock_rns_instance.get_rate_table.return_value = []
diff --git a/tests/frontend/ChangelogModal.test.js b/tests/frontend/ChangelogModal.test.js
index 363f871e..bdf4ebb9 100644
--- a/tests/frontend/ChangelogModal.test.js
+++ b/tests/frontend/ChangelogModal.test.js
@@ -122,7 +122,8 @@ describe("ChangelogModal.vue", () => {
await wrapper.vm.show();
await wrapper.vm.$nextTick();
- const closeBtn = wrapper.find(".v-btn");
+ const closeBtn = wrapper.find("button.v-btn");
+ expect(closeBtn.exists()).toBe(true);
expect(closeBtn.attributes("class")).toContain("dark:hover:bg-white/10");
expect(closeBtn.attributes("class")).toContain("hover:bg-black/5");
});
diff --git a/tests/frontend/ConversationViewer.test.js b/tests/frontend/ConversationViewer.test.js
index 79fcb040..3c105630 100644
--- a/tests/frontend/ConversationViewer.test.js
+++ b/tests/frontend/ConversationViewer.test.js
@@ -1,11 +1,13 @@
import { mount } from "@vue/test-utils";
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import ConversationViewer from "@/components/messages/ConversationViewer.vue";
+import WebSocketConnection from "@/js/WebSocketConnection";
describe("ConversationViewer.vue", () => {
let axiosMock;
beforeEach(() => {
+ WebSocketConnection.connect();
axiosMock = {
get: vi.fn().mockImplementation((url) => {
if (url.includes("/path")) return Promise.resolve({ data: { path: [] } });
@@ -44,6 +46,7 @@ describe("ConversationViewer.vue", () => {
afterEach(() => {
delete window.axios;
vi.unstubAllGlobals();
+ WebSocketConnection.destroy();
});
const mountConversationViewer = (props = {}) => {
diff --git a/tests/frontend/DocsPage.test.js b/tests/frontend/DocsPage.test.js
index 0eab2cc8..fa457b27 100644
--- a/tests/frontend/DocsPage.test.js
+++ b/tests/frontend/DocsPage.test.js
@@ -32,11 +32,16 @@ describe("DocsPage.vue", () => {
});
afterEach(() => {
- delete window.axios;
+ if (wrapper) {
+ wrapper.unmount();
+ }
+ // Do not delete window.axios, as it might be used by async operations
+ // and it is globally defined in setup.js anyway.
});
+ let wrapper;
const mountDocsPage = () => {
- return mount(DocsPage, {
+ wrapper = mount(DocsPage, {
global: {
directives: {
"click-outside": vi.fn(),
@@ -50,6 +55,7 @@ describe("DocsPage.vue", () => {
},
},
});
+ return wrapper;
};
it("renders download button when no docs are present", async () => {
diff --git a/tests/frontend/MicronEditorPage.test.js b/tests/frontend/MicronEditorPage.test.js
index ee0db714..11aa8cee 100644
--- a/tests/frontend/MicronEditorPage.test.js
+++ b/tests/frontend/MicronEditorPage.test.js
@@ -62,8 +62,9 @@ describe("MicronEditorPage.vue", () => {
await wrapper.vm.$nextTick();
await wrapper.vm.$nextTick(); // Wait for loadContent
- expect(wrapper.vm.tabs.length).toBe(1);
+ expect(wrapper.vm.tabs.length).toBe(2);
expect(wrapper.vm.tabs[0].name).toBe("tools.micron_editor.main_tab");
+ expect(wrapper.vm.tabs[1].name).toBe("tools.micron_editor.guide_tab");
expect(wrapper.text()).toContain("tools.micron_editor.title");
});
@@ -88,8 +89,7 @@ describe("MicronEditorPage.vue", () => {
await wrapper.vm.$nextTick();
await wrapper.vm.$nextTick();
- // Add a second tab so we can remove one (close button only shows if tabs.length > 1)
- await wrapper.vm.addTab();
+ // Already have 2 tabs (Main + Guide)
expect(wrapper.vm.tabs.length).toBe(2);
// Find close button on the second tab
@@ -105,14 +105,14 @@ describe("MicronEditorPage.vue", () => {
await wrapper.vm.$nextTick();
await wrapper.vm.$nextTick();
- await wrapper.vm.addTab();
- expect(wrapper.vm.activeTabIndex).toBe(1);
+ // Initially on first tab
+ expect(wrapper.vm.activeTabIndex).toBe(0);
- // Click first tab
+ // Click second tab (Guide)
const tabs = wrapper.findAll(".group.flex.items-center");
- await tabs[0].trigger("click");
+ await tabs[1].trigger("click");
- expect(wrapper.vm.activeTabIndex).toBe(0);
+ expect(wrapper.vm.activeTabIndex).toBe(1);
});
it("resets all tabs when clicking reset button", async () => {
@@ -120,8 +120,9 @@ describe("MicronEditorPage.vue", () => {
await wrapper.vm.$nextTick();
await wrapper.vm.$nextTick();
+ const initialTabCount = wrapper.vm.tabs.length;
await wrapper.vm.addTab();
- expect(wrapper.vm.tabs.length).toBe(2);
+ expect(wrapper.vm.tabs.length).toBe(initialTabCount + 1);
// Find reset button
const resetButton = wrapper.find('.mdi-stub[data-icon-name="refresh"]').element.parentElement;
@@ -129,7 +130,7 @@ describe("MicronEditorPage.vue", () => {
expect(window.confirm).toHaveBeenCalled();
expect(micronStorage.clearAll).toHaveBeenCalled();
- expect(wrapper.vm.tabs.length).toBe(1);
+ expect(wrapper.vm.tabs.length).toBe(2); // Resets to Main + Guide
expect(wrapper.vm.activeTabIndex).toBe(0);
});
diff --git a/tests/frontend/Toast.test.js b/tests/frontend/Toast.test.js
index 21369847..ca7d9edc 100644
--- a/tests/frontend/Toast.test.js
+++ b/tests/frontend/Toast.test.js
@@ -4,29 +4,42 @@ import Toast from "@/components/Toast.vue";
import GlobalEmitter from "@/js/GlobalEmitter";
describe("Toast.vue", () => {
+ let wrapper;
+
beforeEach(() => {
vi.useFakeTimers();
+ wrapper = mount(Toast, {
+ global: {
+ stubs: {
+ TransitionGroup: { template: "<div><slot /></div>" },
+ MaterialDesignIcon: {
+ name: "MaterialDesignIcon",
+ template: '<div class="mdi-stub"></div>',
+ props: ["iconName"],
+ },
+ },
+ },
+ });
});
afterEach(() => {
+ if (wrapper) {
+ wrapper.unmount();
+ }
vi.useRealTimers();
- // Clear all listeners from GlobalEmitter to avoid test pollution
- GlobalEmitter.off("toast");
});
it("adds a toast when GlobalEmitter emits 'toast'", async () => {
- const wrapper = mount(Toast);
-
GlobalEmitter.emit("toast", { message: "Test Message", type: "success" });
await wrapper.vm.$nextTick();
expect(wrapper.text()).toContain("Test Message");
- expect(wrapper.findComponent({ name: "MaterialDesignIcon" }).props("iconName")).toBe("check-circle");
+ const icon = wrapper.findComponent({ name: "MaterialDesignIcon" });
+ expect(icon.exists()).toBe(true);
+ expect(icon.props("iconName")).toBe("check-circle");
});
it("removes a toast after duration", async () => {
- const wrapper = mount(Toast);
-
GlobalEmitter.emit("toast", { message: "Test Message", duration: 1000 });
await wrapper.vm.$nextTick();
@@ -39,8 +52,6 @@ describe("Toast.vue", () => {
});
it("removes a toast when clicking the close button", async () => {
- const wrapper = mount(Toast);
-
GlobalEmitter.emit("toast", { message: "Test Message", duration: 0 });
await wrapper.vm.$nextTick();
@@ -48,13 +59,12 @@ describe("Toast.vue", () => {
const closeButton = wrapper.find("button");
await closeButton.trigger("click");
+ await wrapper.vm.$nextTick();
expect(wrapper.text()).not.toContain("Test Message");
});
it("assigns correct classes for different toast types", async () => {
- const wrapper = mount(Toast);
-
GlobalEmitter.emit("toast", { message: "Success", type: "success" });
GlobalEmitter.emit("toast", { message: "Error", type: "error" });
await wrapper.vm.$nextTick();
diff --git a/tests/frontend/setup.js b/tests/frontend/setup.js
new file mode 100644
index 00000000..23426f4d
--- /dev/null
+++ b/tests/frontend/setup.js
@@ -0,0 +1,83 @@
+import { vi } from "vitest";
+import { config } from "@vue/test-utils";
+
+// Global mocks
+global.performance.mark = vi.fn();
+global.performance.measure = vi.fn();
+global.performance.getEntriesByName = vi.fn(() => []);
+global.performance.clearMarks = vi.fn();
+global.performance.clearMeasures = vi.fn();
+
+// Mock window.axios by default to prevent TypeErrors
+global.axios = {
+ get: vi.fn().mockResolvedValue({ data: {} }),
+ post: vi.fn().mockResolvedValue({ data: {} }),
+ put: vi.fn().mockResolvedValue({ data: {} }),
+ patch: vi.fn().mockResolvedValue({ data: {} }),
+ delete: vi.fn().mockResolvedValue({ data: {} }),
+};
+window.axios = global.axios;
+
+// Stub all Vuetify components to avoid warnings and CSS issues
+config.global.stubs = {
+ MaterialDesignIcon: { template: '<div class="mdi-stub"><slot /></div>' },
+ RouterLink: { template: "<a><slot /></a>" },
+ RouterView: { template: "<div><slot /></div>" },
+ // Common Vuetify components
+ "v-app": true,
+ "v-main": true,
+ "v-container": true,
+ "v-row": true,
+ "v-col": true,
+ "v-btn": true,
+ "v-icon": true,
+ "v-card": true,
+ "v-card-title": true,
+ "v-card-text": true,
+ "v-card-actions": true,
+ "v-dialog": true,
+ "v-text-field": true,
+ "v-textarea": true,
+ "v-select": true,
+ "v-switch": true,
+ "v-checkbox": true,
+ "v-list": true,
+ "v-list-item": true,
+ "v-list-item-title": true,
+ "v-list-item-subtitle": true,
+ "v-menu": true,
+ "v-divider": true,
+ "v-spacer": true,
+ "v-progress-circular": true,
+ "v-progress-linear": true,
+ "v-tabs": true,
+ "v-tab": true,
+ "v-window": true,
+ "v-window-item": true,
+ "v-expansion-panels": true,
+ "v-expansion-panel": true,
+ "v-expansion-panel-title": true,
+ "v-expansion-panel-text": true,
+ "v-chip": true,
+ "v-toolbar": true,
+ "v-toolbar-title": true,
+ "v-tooltip": true,
+ "v-alert": true,
+ "v-snackbar": true,
+ "v-badge": true,
+};
+
+// Mock window.matchMedia
+Object.defineProperty(window, "matchMedia", {
+ writable: true,
+ value: vi.fn().mockImplementation((query) => ({
+ matches: false,
+ media: query,
+ onchange: null,
+ addListener: vi.fn(), // deprecated
+ removeListener: vi.fn(), // deprecated
+ addEventListener: vi.fn(),
+ removeEventListener: vi.fn(),
+ dispatchEvent: vi.fn(),
+ })),
+});
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────